콘텐츠로 이동

트랜잭션

1. 트랜잭션 개념

하나의 논리적 작업 단위로, 모두 성공하거나 모두 실패해야 합니다.

계좌 이체 예시:
1. A 계좌에서 10만원 출금
2. B 계좌에 10만원 입금
→ 둘 다 성공하거나 둘 다 실패해야 함

2. ACID 속성

속성 영문 설명
원자성 Atomicity 전부 성공하거나 전부 실패 (All or Nothing)
일관성 Consistency 트랜잭션 전후 DB 상태가 일관성 유지
격리성 Isolation 동시 실행 트랜잭션이 서로 영향을 주지 않음
지속성 Durability 커밋된 트랜잭션은 영구적으로 반영

3. 트랜잭션 명령어

BEGIN TRANSACTION;   -- 트랜잭션 시작

UPDATE Account SET balance = balance - 100000 WHERE id = 'A';
UPDATE Account SET balance = balance + 100000 WHERE id = 'B';

COMMIT;    -- 성공 시 영구 저장
ROLLBACK;  -- 실패 시 이전 상태로 되돌림

4. 동시성 제어

여러 트랜잭션이 동시에 실행될 때 발생하는 문제를 제어합니다.

동시성 문제

문제 설명
갱신 손실 (Lost Update) 두 트랜잭션이 같은 데이터 수정 시 하나의 수정이 사라짐
더티 리드 (Dirty Read) 커밋되지 않은 데이터를 다른 트랜잭션이 읽음
반복 불가능 읽기 (Non-repeatable Read) 같은 쿼리를 두 번 실행했을 때 결과가 다름
팬텀 리드 (Phantom Read) 같은 조건으로 조회 시 없던 행이 생기거나 사라짐

락 (Lock)

공유락 (Shared Lock, S-Lock)

  • 읽기에 사용
  • 여러 트랜잭션이 동시에 공유락 획득 가능
  • 공유락 상태에서 배타락 획득 불가

배타락 (Exclusive Lock, X-Lock)

  • 쓰기에 사용
  • 하나의 트랜잭션만 획득 가능
  • 다른 트랜잭션의 읽기/쓰기 모두 차단

MVCC (Multi-Version Concurrency Control)

락 없이 데이터의 이전 버전을 저장해 동시성을 높입니다.

  • 읽기와 쓰기가 서로 차단하지 않음
  • PostgreSQL, MySQL InnoDB에서 사용

5. 격리 수준 (Isolation Level)

낮을수록 동시성↑, 정합성↓

격리 수준 더티 리드 반복불가능 읽기 팬텀 리드
READ UNCOMMITTED 발생 발생 발생
READ COMMITTED 방지 발생 발생
REPEATABLE READ 방지 방지 발생
SERIALIZABLE 방지 방지 방지

MySQL 기본값: REPEATABLE READ / Oracle 기본값: READ COMMITTED


시험 포인트

  • ACID 4가지 각각의 의미 암기 필수
  • 원자성: All or Nothing
  • 격리 수준 4단계 순서와 각 단계에서 방지되는 문제
  • 더티 리드: 커밋 안 된 데이터 읽기
  • COMMIT vs ROLLBACK: 영구 저장 vs 원상복구
  • 공유락 vs 배타락: 읽기 공유 가능 vs 독점