Two-phase Locking
Two-phase Locking
Two-phase Locking 이란
- DB 트랜잭션에서 동시성 제어를 수행하기 위한 방법, 2PL이라고도 함.
- Serializability를 보장함.
- Lock을 이용해 한 트랜잭션 동안 다른 트랜잭션의 데이터 접근을 막음. 이 때문에 deadlock 발생 가능.
Data-access Lock
- DB에서 lock은 트랜잭션이 DB의 객체로부터 획득해야 하는 시스템 오브젝트. 사용 후에는 lock을 해제.
- 한 트랜잭션이 어떤 DB 객체에 대한 lock을 획득하면, 다른 트랜잭션이 해당 객체에 접근 시 접근 가능 여부를 체크해야함.
- 만약 다른 트랜잭션이 접근이 불가능하다고 확인되면, 해당 트랜잭션을 block 함.
- DB 객체를 읽기 위해서는 read lock을 획득하고, 쓰기 위해서는 write lock을 획득.
Read & Write Lock
- 트랜잭션이 DB 객체의 write lock을 획득한 경우 다른 트랜잭션이 쓰거나 읽으려고 하면 block됨.
- 트랜잭션이 DB 객체의 read lock을 획득한 경우 다른 트랜잭션이 쓰려고 하면 block됨.
- 반면 read lock을 획득한 경우 해당 객체를 읽으려는 다른 트랜잭션은 block하지 않음. (즉, 추가적인 read lock 획득 가능)
- 즉, lock의 compatibility를 표로 나타내면 다음과 같음.
Lock type | read-lock | write-lock |
---|
read-lock | O | X |
write-lock | X | X |
Two-phase Locking Protocol
- Two-phase locking은 트랜잭션의 실행 중 lock 연산이 실행되는 과정을 다음과 같이 두 개의 단계로 나눔.
- Expanding Phase: 트랜잭션이 lock을 획득만 하고 해제하지 않는 단계.
- Shrinking Phase: Lock을 더 이상 획득하지 않고 해제만 함.
- Lock을 한번 해제한 다음부터는 다시 lock을 획득하지 않는 방법.
- Conservative 2PL, Strict 2PL, Rigorous 2PL등의 변형 존재.
Strict 2PL
- 2PL을 만족하면서, 추가적으로 트랜잭션이 끝났을 때만 write lock을 해제하는 방법.
- Read lock은 정상적으로 해제됨.
- B-tree를 사용한다면 bottleneck 발생 가능.
Strong strict 2PL
- Rigorous 2PL이라고도 하며, stritct 2PL을 만족해야 함.
- Read lock과 write lock 둘 다 트랜잭션이 끝난 후에 해제.
- Serializability를 완벽히 보장하며, 대부분의 DB에서 채용하는 방법.
Conservative 2PL
- Deadlock을 방지하기 위한 방법으로, 트랜잭션 시작 전에 필요한 데이터의 lock을 모든 획득.
- 현실적으로 사용하기 힘듦.
References
- https://en.wikipedia.org/wiki/Two-phase_locking