2PL로 이해하는 트랜잭션 락과 직렬화 가능성
2PL의 확장·수축 단계와 공유·독점 락의 호환성, 데드락과 연쇄 복귀, Strict 2PL 변형 및 DBMS 적용 방식을 정리한다.
2026-08-14 · 최초 발행 2025-08-10
락을 획득하는 구간과 해제하는 구간
동시에 실행되는 트랜잭션이 같은 데이터에 접근하면 일관성이 깨질 수 있다. 2PL(Two-Phase Locking)은 락의 획득과 해제를 분리해 트랜잭션 직렬화 가능성(Serializability)을 보장하는 대표적인 락킹 프로토콜이다.
트랜잭션은 먼저 확장 단계(Growing Phase)를 거친다. 이 구간에서는 새 락을 얻을 수 있지만, 이미 가진 락은 해제할 수 없다. 읽을 데이터에는 공유 락(Shared Lock)을, 쓸 데이터에는 독점 락(Exclusive Lock)을 확보한다.
수축 단계(Shrinking Phase)가 시작되면 상황이 바뀐다. 트랜잭션은 보유 락을 해제할 수 있지만 더 이상 새로운 락을 얻을 수 없다. 데이터 항목에 대한 작업을 마칠 때마다 락을 풀고, 처리가 끝나면 남은 락도 해제한다.
락 호환성이 만드는 실행 경계
2PL에서는 데이터 접근 전에 해당 연산에 맞는 락을 얻어야 한다. 공유 락(S-Lock)은 읽기 작업을 위한 락으로, 여러 트랜잭션이 동시에 획득할 수 있다. 반면 독점 락(X-Lock)은 쓰기 작업에 사용되며 한 번에 하나의 트랜잭션만 획득할 수 있다.
공유 락끼리는 호환되므로 여러 트랜잭션이 같은 데이터를 함께 읽을 수 있다. 하지만 공유 락과 독점 락은 호환되지 않아 읽는 동안 쓰기를 허용하지 않으며, 독점 락끼리도 호환되지 않아 쓰기 중 다른 쓰기를 막는다. 이 규칙을 통해 동시 실행된 트랜잭션이 직렬 실행과 같은 결과를 내도록 제어한다.
기본 2PL에서 남는 운영 문제
락을 순서 없이 확보하는 구조에서는 데드락(Deadlock)이 생길 수 있다. 예를 들어 트랜잭션 A가 데이터 X의 락을 보유한 채 Y의 락을 기다리고, 트랜잭션 B가 Y의 락을 보유한 채 X의 락을 기다리면 둘 다 진행하지 못한다.
연쇄 복귀(Cascading Rollback)도 고려 대상이다. 한 트랜잭션이 롤백되었을 때 그 트랜잭션이 수정한 데이터를 읽은 다른 트랜잭션까지 롤백해야 할 수 있다. 이는 성능 저하와 자원 낭비로 이어진다.
락 유지 방식을 달리한 2PL 변형
Strict 2PL은 모든 독점 락(X-Lock)을 트랜잭션이 완료될 때까지 유지한다. 커밋 또는 롤백 전에는 독점 락을 해제하지 않으므로 연쇄 복귀 문제를 막을 수 있으며, 대부분의 상용 DBMS에서 채택하는 방식이다.
Rigorous 2PL은 독점 락뿐 아니라 공유 락(S-Lock)까지 트랜잭션 완료 시점까지 유지한다. Strict 2PL보다 제약은 크지만 더 높은 수준의 일관성을 보장하며, 회복성(Recoverability)을 다루기 쉽다.
Static 2PL은 트랜잭션을 시작하기 전에 필요한 모든 락을 선언하고 한 번에 획득한다. 실행 중 추가 락 획득이 없으므로 데드락을 원천적으로 방지한다. 다만 필요하지 않은 락까지 선점할 수 있어 동시성이 낮아질 가능성이 있다.
송금 트랜잭션에서의 락 순서
두 계좌 사이의 송금에서는 잔액을 읽고 갱신할 계좌에 독점 락을 확보한 뒤 작업을 수행할 수 있다. 아래 흐름에서 계좌A와 계좌B의 락은 확장 단계에서 획득되고, 변경이 끝난 뒤 수축 단계에서 해제된다.
Strict 2PL을 적용하면 트랜잭션이 완료될 때까지 모든 X-Lock을 유지한다.
Oracle은 엄격 2PL과 다중 버전 동시성 제어(MVCC)를 혼합해 사용한다. SQL Server는 주로 엄격 2PL을 채택하고 격리 수준에 따라 락 보유 시간을 조정한다. MySQL(InnoDB)은 엄격 2PL과 MVCC를 결합하며, PostgreSQL은 주로 MVCC 기반이지만 특정 연산에서는 2PL 방식을 사용한다.
락 관리자가 다뤄야 할 항목
락 관리자는 락 획득·해제와 대기 요청을 처리하고, 락 호환성 테이블을 관리하며, 데드락 감지 및 해결 메커니즘을 구현해야 한다.
데드락 대응에는 일정 시간 이상 대기한 트랜잭션을 중단하는 타임아웃(Timeout), 대기 그래프로 순환 대기를 찾는 데드락 감지(Deadlock Detection), 트랜잭션 우선순위로 가능성을 사전에 줄이는 데드락 예방(Deadlock Prevention)이 있다.
성능 측면에서는 테이블·페이지·행 수준 중 적절한 락 단위(Granularity)를 선택해야 한다. 다수의 작은 락을 하나의 큰 락으로 바꾸는 락 에스컬레이션(Lock Escalation)과 계층적 락킹 구조의 의도 락(Intention Lock)도 함께 검토할 대상이다.
2PL은 데이터베이스의 일관성과 무결성을 지키는 기본 동시성 제어 메커니즘이다. Strict 2PL, Rigorous 2PL, Static 2PL처럼 제약을 달리한 방식과 MVCC, 타임스탬프 기반 방식을 시스템 요구사항과 특성에 맞춰 조합할 수 있다.