topic난이도 · 약 20

병행 제어 & 격리 수준

여러 트랜잭션이 동시에 실행될 때 일관성을 유지하기 위한 기법. 로킹 · 타임스탬프 · MVCC.

#DB#병행제어#격리수준#2PL
왜 배우는가

격리 수준 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 ReadNon-repeatablePhantom비고
READ UNCOMMITTEDOOO가장 느슨
READ COMMITTEDXOOOracle 기본
REPEATABLE READXXOMySQL InnoDB 기본
SERIALIZABLEXXX가장 엄격, 성능 ↓

3대 이상현상 - Dirty Read: 다른 트랜잭션의 커밋 전 값을 읽음 - Non-repeatable Read: 같은 트랜잭션 안에서 같은 행을 두 번 읽었는데 값이 다름 (중간에 UPDATE) - Phantom Read: 같은 조건으로 SELECT 했는데 행 개수가 다름 (중간에 INSERT/DELETE)

로킹 단위(Lock Granularity) 는 테이블 → 페이지 → 행 → 필드 순으로 작아진다. 단위가 크면 관리·오버헤드가 적지만 병행성이 낮고, 작으면 병행성은 높지만 오버헤드가 커진다.

데드락(Deadlock) 해결 - 예방(Prevention): 순환 대기 자체를 금지 (자원 순서 강제) - 회피(Avoidance): 은행원 알고리즘으로 안전 상태 유지 - 탐지(Detection): Wait-for Graph에 사이클 발생 감지 후 희생자 선정 - 회복(Recovery): 희생자 트랜잭션을 Abort 후 재시작

실기 드릴 5문항
edit실기 드릴 · 단답형

트랜잭션이 모든 Lock을 먼저 획득한 뒤(확장), 그 이후로는 해제만 허용(수축)하는 병행 제어 프로토콜은?

edit실기 드릴 · 단답형

격리 수준 4단계 중 Dirty Read를 방지하는 가장 낮은 수준은?

space_bar실기 드릴 · 빈칸 채우기

같은 조건으로 SELECT를 두 번 수행했을 때 결과 행의 수가 달라지는 이상현상을 ( ) (이)라 한다.

edit실기 드릴 · 단답형

데이터를 변경할 때 새 버전을 생성하고, 읽는 트랜잭션은 이전 버전의 스냅샷을 보게 하여 읽기/쓰기 충돌을 없애는 병행 제어 기법은?

check_circle실기 드릴 · OX

로킹 단위가 작을수록 병행성은 높아지고 오버헤드는 감소한다.