핵심 규칙

잠금을 한 번 모으기 시작하면, 풀기 전까지는 계속 획득만 합니다.

2PL은 트랜잭션의 잠금 흐름을 확장 단계와 축소 단계로 분리합니다. 한 번 해제를 시작한 뒤에는 새 락을 다시 잡지 못하므로, 충돌 순서가 뒤집히지 않고 직렬 가능한 실행 순서를 만들 수 있습니다.

학습 포인트

외울 것은 단계 이름이 아니라 경계입니다. 첫 unlock 이후 lock 금지가 2PL의 핵심 제약입니다.

보유 중인 락 수 시간 흐름
1. 락 수가 늘어남
2. 마지막 락 확보
3. 락 수가 줄어듦

확장 단계

필요한 자원에 대한 락을 모으는 구간입니다. 아직 아무 락도 풀지 않습니다.

가능S(A), X(B)처럼 새 락 획득
금지보유한 락을 먼저 해제하기

전환점

이 시점에 필요한 락을 모두 확보했습니다. 이제부터 잠금 집합은 더 커질 수 없습니다.

의미마지막 lock() 호출이 끝난 경계
핵심여기서 흐름이 “획득만”에서 “해제만”으로 바뀜

축소 단계

작업이 끝난 락을 순서대로 풀어 가는 구간입니다. 이제 새 락은 다시 잡을 수 없습니다.

가능unlock(B), unlock(A)로 해제
금지해제 후 새로운 락 재획득
왜 직렬 가능성이 보장될까?

잠금이 증가하다가 한 번만 감소하므로, 트랜잭션 사이의 충돌 순서가 중간에 뒤집히지 않습니다. 그래서 2PL을 따르면 충돌 직렬 가능성을 만족합니다.

그래도 남는 위험

각 트랜잭션이 확장 단계에서 락을 모으는 동안 서로의 락을 기다릴 수 있으므로, 데드락은 여전히 발생할 수 있습니다.