트랜잭션¶
1. 트랜잭션 개념¶
하나의 논리적 작업 단위로, 모두 성공하거나 모두 실패해야 합니다.
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 독점