트랜잭션 직렬가능성의 절대 원칙: 2-Phase Locking (2PL) 규약 완벽 해부
다중 사용자 환경에서 데이터베이스의 무결성을 보장하기 위한 락(Lock) 기반 동시성 제어의 핵심 알고리즘. 확장 단계(Growing)와 수축 단계(Shrinking)의 분리 메커니즘을 통해 직렬가능성(Serializability)을 수학적으로 보장하는 2PL의 구조와 다양한 변형(Strict, Rigorous)을 심층 분석한다.
가. 단순 락(Locking) 기법의 치명적 한계
DBMS에서 여러 트랜잭션이 동시에 실행될 때, 상호 간섭으로 인해 발생하는 데이터 갱신 손실(Lost Update), 모순성(Inconsistency), 연쇄 복귀(Cascading Rollback)를 막기 위해 데이터에 락(Lock, 잠금)을 건다. 하지만 트랜잭션 도중에 락을 임의로 걸고 풀기를 반복하면, 락을 사용함에도 불구하고 트랜잭션이 순차적으로 실행된 것과 같은 결과를 보장하는 직렬가능성(Serializability)이 깨지는 문제가 발생한다.
나. 2-Phase Locking (2PL, 2단계 잠금 규약)의 본질
- 정의: 트랜잭션 내의 모든 락(Lock) 연산과 언락(Unlock) 연산을 2개의 분리된 단계(Phase)로 명확히 나누어 수행하도록 강제하는 규약이다.
- 목적: 2PL 규약을 준수하는 모든 트랜잭션 스케줄은 반드시 충돌 직렬가능(Conflict Serializable)함이 수학적으로 증명되어 있다. 즉, 2PL은 데이터베이스 일관성 유지의 핵심 메커니즘이다.
가. 2단계 잠금 규약의 라이프사이클 도해도
트랜잭션은 실행됨에 따라 필요한 락을 점진적으로 획득하며 정점(Lock Point)에 도달한 후, 일제히 혹은 점진적으로 락을 해제한다. 중요한 원칙은 '한 번이라도 락을 해제(Unlock)하기 시작하면, 더 이상 새로운 락(Lock)을 획득할 수 없다'는 것이다.
나. 2PL의 교착 상태(Deadlock) 한계점
기본 2PL 규약은 트랜잭션의 직렬가능성은 100% 보장하지만, 교착 상태(Deadlock)를 원천적으로 예방하지는 못한다.
트랜잭션 T1이 데이터 A에 락을 걸고 데이터 B의 락을 대기하는 동안, 트랜잭션 T2가 B에 락을 걸고 A의 락을 대기한다면 두 트랜잭션은 영원히 수축 단계(Shrinking)로 넘어가지 못하고 교착 상태에 빠지게 된다. 이를 해결하기 위해 DB 엔진 내부에 별도의 타임아웃이나 Wait-Die/Wound-Wait 알고리즘이 병행되어야 한다.
기본 2PL은 트랜잭션이 완전히 종료(Commit)되기 전에 일부 락을 수축 단계에서 일찍 풀어버린다. 만약 다른 트랜잭션이 이 풀린 데이터를 읽고 연산을 수행했는데, 앞선 트랜잭션이 Rollback된다면 뒤따르던 트랜잭션들도 줄줄이 취소되어야 하는 연쇄 복귀(Cascading Rollback) 문제가 발생한다. 이를 막기 위해 2PL은 점차 엄격해지는 방향으로 발전했다.
| 분류 | 명칭 및 약어 | 락(Lock) 해제 시점 및 아키텍처 특성 | 해결하는 주요 문제 |
|---|---|---|---|
| Basic 2PL | 기본 2단계 잠금 (Basic 2PL) |
Lock Point 이후 필요 없는 락을 점진적으로 해제한다. 자원 활용도는 좋지만, 커밋 전 풀린 락으로 인해 연쇄 복귀 위험이 크다. | 직렬가능성 보장 |
| Strict 2PL | 엄격한 2단계 잠금 (S2PL) |
공유 락(Read Lock)은 수축 단계에서 점진적으로 풀지만, 배타 락(Write Lock)은 트랜잭션이 Commit/Rollback 될 때까지 모두 유지하다가 한 번에 푼다. (가장 대중적인 DBMS 구현) | 연쇄 복귀 (Cascading Rollback) 방지 |
| Rigorous 2PL | 강건한 2단계 잠금 (SS2PL) |
배타 락(Write Lock)뿐만 아니라, 공유 락(Read Lock)을 포함한 모든 락을 Commit/Rollback 시점까지 유지한다. 구현이 단순하고 안정적이나 동시성이 크게 저하된다. | 완벽한 고립성 보장 (구현 단순화) |
| Static 2PL | 보수적 2단계 잠금 (Conservative 2PL) |
트랜잭션 시작 시, 자신이 필요로 하는 모든 데이터의 락을 한꺼번에 획득(확장)해야만 실행을 시작한다. 하나라도 획득을 못하면 대기한다. | 교착 상태 (Deadlock) 완벽 예방 |
이름이 유사하여 실무자나 기술사 수험생들이 가장 자주 혼동하는 두 가지 데이터베이스 코어 알고리즘이다. 두 규약은 목적 자체가 완전히 다르다.
| 비교 관점 | 2-Phase Locking (2PL) | 2-Phase Commit (2PC) |
|---|---|---|
| 핵심 목적 | 단일 또는 다중 노드에서 동시성 제어(Concurrency Control)를 통한 고립성(Isolation) 보장. 여러 트랜잭션이 엉키지 않게 직렬가능성을 유지함. | 분산 데이터베이스(MSA 등) 환경에서 글로벌 트랜잭션의 원자성(Atomicity) 보장. 모든 노드가 함께 성공하거나 함께 실패(All-or-Nothing)하도록 제어함. |
| 2 Phase 의미 | 1단계: Growing (락 획득만 가능) 2단계: Shrinking (락 해제만 가능) |
1단계: Prepare (모두 커밋 준비 완료 확인) 2단계: Commit / Rollback (실제 실행) |
| 관리 주체 | DBMS 내부의 Lock Manager (락 매니저) | 글로벌 분산 트랜잭션을 지휘하는 Transaction Manager (코디네이터) |
'데이터베이스' 카테고리의 다른 글
| 장바구니 분석의 비밀: 연관 분석(Association Analysis) 개념과 주요 알고리즘 (0) | 2026.05.23 |
|---|---|
| DB 설계의 뼈대: 함수적 종속성(FD)의 개념과 완전/부분/이행적 종속 심층 분석 (0) | 2026.05.13 |
| MSA 환경의 데이터 일관성 보장: 2PC의 Prepare-Commit 원리와 Saga(사가) 패턴 비교 (0) | 2026.04.16 |
| 데이터 파이프라인의 진화: Data Lake에서 Data Mesh, 그리고 카파(Kappa) 아키텍처까지 (0) | 2026.04.09 |
| 쿼리 성능의 비밀: 하드 파싱 vs 소프트 파싱, 그리고 조인(Join) 알고리즘 해부 (0) | 2026.04.06 |