복잡한뇌구조마냥

[DB] 트랜잭션(Transaction)과 ACID 특성 정리 본문

BE/DB

[DB] 트랜잭션(Transaction)과 ACID 특성 정리

지금해냥 2025. 10. 29. 08:46

데이터베이스에서 트랜잭션(Transaction)
“하나의 논리적인 작업 단위(Logical Unit of Work)”를 의미합니다.

즉, 여러 SQL 작업을 하나의 묶음으로 처리해서
모두 성공하면 Commit, 하나라도 실패하면 Rollback 하는 개념이에요.


💡 트랜잭션(Transaction) 이란?

하나 이상의 SQL 명령어를 하나의 논리적 단위로 묶어서,
전부 성공하거나 전부 실패하도록 보장하는 것.

예를 들어, 계좌이체를 생각해볼까요?

 
A 계좌에서 10,000원 출금 B 계좌에 10,000원 입금

이 두 작업은 둘 다 성공하거나, 둘 다 실패해야 합니다.
만약 출금만 되고 입금이 안 되면 큰일이죠 😅

👉 이처럼 데이터의 일관성과 무결성을 보장하기 위해 트랜잭션이 필요합니다.


🧩 트랜잭션의 4가지 ACID 특성

트랜잭션은 아래 ACID 4가지 원칙을 만족해야 합니다.

이름 설명 예시
Atomicity (원자성) 트랜잭션은 “모두 수행되거나 전혀 수행되지 않아야 함” 계좌이체 시 출금만 되고 입금이 안 되면 ROLLBACK
Consistency (일관성) 트랜잭션 전후 데이터의 무결성 제약조건이 유지되어야 함 외래키, 제약조건 위배 없이 항상 일관된 상태
Isolation (격리성) 여러 트랜잭션이 동시에 수행돼도 서로 간섭하지 않아야 함 동시에 A→B, C→D 이체가 되어도 결과가 섞이지 않음
Durability (지속성) 트랜잭션이 Commit된 후에는 시스템 장애에도 결과가 보존됨 Commit된 데이터는 서버가 꺼져도 복구 가능

🧠 트랜잭션 동작 예시

 
-- 계좌이체 트랜잭션 예시
START TRANSACTION;

UPDATE account SET balance = balance - 10000 WHERE user_id = 'A';
UPDATE account SET balance = balance + 10000 WHERE user_id = 'B';

COMMIT;

만약 두 번째 UPDATE에서 오류가 발생하면?

 
ROLLBACK;  -- 전체 트랜잭션 취소 (A의 돈도 원상복구)

이 덕분에 데이터의 무결성이 유지됩니다.
(트랜잭션 단위로 처리 → 안전하게 데이터 관리)


🔄 트랜잭션의 상태 (Transaction States)

트랜잭션은 실행되는 동안 여러 단계를 거칩니다.
DBMS는 이 단계를 통해 트랜잭션의 진행 상황을 추적하고 관리합니다.

🧱 트랜잭션 주요 상태

상태 설명
Active (활동) 트랜잭션이 실행 중인 상태 (SQL 명령어 수행 중)
Partially Committed (부분 커밋) 모든 명령이 실행 완료되어 커밋 직전 상태 (아직 디스크 반영 전)
Committed (커밋됨) 트랜잭션이 성공적으로 종료되어 DB에 영구 반영된 상태
Failed (실패) 트랜잭션 수행 중 오류 또는 시스템 문제로 정상 수행 불가 상태
Aborted (철회) 트랜잭션이 Rollback 되어 이전 상태로 복구된 상태

🔁 트랜잭션 상태 전이도 (Transaction State Diagram)

        ┌──────────────┐
        │   Active     │
        └──────┬───────┘
               │ (모든 연산 수행 완료)
               ▼
     ┌─────────────────────┐
     │ Partially Committed │
     └──────┬──────────────┘
            │ Commit 성공
            ▼
       ┌────────────┐
       │ Committed  │
       └────────────┘

(오류 발생 시)
Active ─────→ Failed ─────→ Aborted
                     (Rollback 후 복구)

💬 쉽게 정리하면

상황 상태
트랜잭션 실행 중 Active
SQL 모두 수행 후 커밋 대기 Partially Committed
커밋 성공 Committed
오류 발생 Failed → Aborted

 


🧱 Isolation Level (격리 수준)

격리성(Isolation)을 세밀하게 조정하기 위해
DBMS는 4가지 격리 수준(Isolation Level) 을 제공합니다.

수준 설명 발생 가능한 문제
READ UNCOMMITTED 커밋되지 않은 데이터도 읽을 수 있음 Dirty Read
READ COMMITTED 커밋된 데이터만 읽음 (기본값 in Oracle) Non-Repeatable Read
REPEATABLE READ 한 트랜잭션 내 동일 쿼리 결과 동일 (기본값 in MySQL) Phantom Read
SERIALIZABLE 완전한 직렬화 (동시성 ↓, 안전성 ↑) 거의 없음

💬 쉽게 말해
격리성이 높을수록 안전하지만 동시성 처리 성능이 낮아짐
→ 상황에 맞게 조정하는 게 중요!


✅ 정리

개념 설명
트랜잭션(Transaction) 여러 SQL 명령어를 하나의 논리 단위로 묶어 처리
COMMIT / ROLLBACK 트랜잭션 확정 / 취소
ACID 특성 원자성, 일관성, 격리성, 지속성
Isolation Level 동시성 제어 단계 (READ UNCOMMITTED → SERIALIZABLE)
LIST