병행 제어 & 격리 수준
여러 트랜잭션이 동시에 실행될 때 일관성을 유지하기 위한 기법. 로킹 · 타임스탬프 · MVCC.
격리 수준 4단계(READ UNCOMMITTED~SERIALIZABLE)와 2PL 프로토콜, 로킹 단위가 필기 단골이다. 특히 Dirty Read / Non-repeatable Read / Phantom Read의 3대 이상현상 구분이 시험 포인트.
병행 제어(Concurrency Control)는 여러 트랜잭션이 동시에 실행되면서도 단일 실행과 동일한 결과가 나오도록 보장하는 기법이다. 가장 널리 쓰이는 방식이 로킹(Locking) 이다.
| 기법 | 설명 | 특징 |
|---|---|---|
| 로킹 (Locking) | 자원에 잠금 설정 | 데드락 위험, 대부분 구현 |
| 타임스탬프 (Timestamp) | 시간 순서로 우선순위 결정 | 데드락 없음 |
| 낙관적 검증 (Optimistic) | 커밋 시점에 충돌 확인 | 충돌 드문 환경에 유리 |
| 다중 버전 (MVCC) | 버전별 스냅샷 유지 | 읽기/쓰기 충돌 없음 (PostgreSQL, Oracle) |
2단계 잠금 프로토콜(2PL, Two-Phase Locking) — ① 확장 단계(Growing): 필요한 모든 Lock 획득 ② 수축 단계(Shrinking): Lock 해제만 허용. 이 규칙을 지키면 직렬 가능성(Serializability) 이 보장된다.
| 격리 수준 | Dirty Read | Non-repeatable | Phantom | 비고 |
|---|---|---|---|---|
| READ UNCOMMITTED | O | O | O | 가장 느슨 |
| READ COMMITTED | X | O | O | Oracle 기본 |
| REPEATABLE READ | X | X | O | MySQL InnoDB 기본 |
| SERIALIZABLE | X | X | X | 가장 엄격, 성능 ↓ |
3대 이상현상 - Dirty Read: 다른 트랜잭션의 커밋 전 값을 읽음 - Non-repeatable Read: 같은 트랜잭션 안에서 같은 행을 두 번 읽었는데 값이 다름 (중간에 UPDATE) - Phantom Read: 같은 조건으로 SELECT 했는데 행 개수가 다름 (중간에 INSERT/DELETE)
로킹 단위(Lock Granularity) 는 테이블 → 페이지 → 행 → 필드 순으로 작아진다. 단위가 크면 관리·오버헤드가 적지만 병행성이 낮고, 작으면 병행성은 높지만 오버헤드가 커진다.
데드락(Deadlock) 해결 - 예방(Prevention): 순환 대기 자체를 금지 (자원 순서 강제) - 회피(Avoidance): 은행원 알고리즘으로 안전 상태 유지 - 탐지(Detection): Wait-for Graph에 사이클 발생 감지 후 희생자 선정 - 회복(Recovery): 희생자 트랜잭션을 Abort 후 재시작
트랜잭션이 모든 Lock을 먼저 획득한 뒤(확장), 그 이후로는 해제만 허용(수축)하는 병행 제어 프로토콜은?
격리 수준 4단계 중 Dirty Read를 방지하는 가장 낮은 수준은?
같은 조건으로 SELECT를 두 번 수행했을 때 결과 행의 수가 달라지는 이상현상을 ( ) (이)라 한다.
데이터를 변경할 때 새 버전을 생성하고, 읽는 트랜잭션은 이전 버전의 스냅샷을 보게 하여 읽기/쓰기 충돌을 없애는 병행 제어 기법은?
로킹 단위가 작을수록 병행성은 높아지고 오버헤드는 감소한다.