하나의 트랜잭션에 데이터를 write 할때 단순한 값변경 과정이 아니고 같은 데이터에 또다른 read/write가 있다면 예상치 못한 값이 read/write 될 수 있기 때문에 Lock을 통해 동시성을 관리한다.
데이터를 read 하거나 write하려는 경우 lock을 획득해야한다. 다른 트랜잭션이 lock을 획득 했을 경우 lock이 반환될때 까지 대기한다.
트랜잭션2가 read lock을 획득하고, 트랜잭션1은 write하려고 하기 때문에 작업을 진행할 수가 없고, 트랜잭션2가 read lock을 반환할 때 까지 대기한다.
트랜잭션2가 read lock을 얻은 상태에서 트랜잭션1이 read하려고 할때 트랜잭션1은 read가 가능하다.
write lock(exclusive lock) : read / write 할 때 사용한다.
다른 트랜잭션이 같은 데이터를 read / write 하는것을 허용하지 않는다.
(둘다 허용하지 않는다)
read lock(shared lock) : read 할 때 사용한다.
다른 트랜잭션이 같은 데이터를 read 하는 것은 허용한다.
2PL(two-phase locking)
read lock을 획득하고 read 후 read lock을 반납한 후에 write lock 획득
read lock을 획득하고 read 후 write lock을 획득한 후 read lock을 반납한다. 락을 지니고 있는 상태에서 다른락이 필요할 경우 다른락을 획득 한 후에 기존 락이 반납가능하게 한다.
먼저 시작한 트랜잭션이 락을 획득하고 모든 락을 획득하는 작업이 최초로 락을 반납하기 전에 모두 발생한다.
락을 획득만 하는 expanding phase, 락을 반환만 하는 shrinking phase가 존재하기 때문에 two phase locking이라 한다.
lock을 취득하기만 하고 반환하지는 않는 phase
락을 획득하고 데이터를 처리하면서 락을 반납한다. 락을 반환한 후로는 절대 락을 획득하지 않는다.
conservation 2PL : 모든 락을 획득한 후 transaction을 시작한다.
데드락이 발생하지 않지만, 성능이 낮다.
strict 2PL : recoverability를 보장하기 때문에, 롤백이 일어나도 데이터 정합성을 충족시킨다. write lock을 지닌 트랜잭션이 commit 또는 rollback 한 후 부터 write lock을 반환한다.
strong strict 2PL : write lock 뿐만 아니라, read lock도 write lock이 commit 또는 rollback된 후 부터 lock을 반환한다.
lock을 반환만 하고 취득하지는 않는 phase. 한번 unlock을 수행하면 절대 lock을 획득하지 않는다.
2PL protocol은 Serializable을 보장한다.
한 트랜잭션이 read lock을 획득하고 다른 트랜잭션이 write를 해야할 때 해당 트랜잭션은 write lock을 획득할때 까지 block 상태이다.
그리고 트랜잭션2가 read 후 write lock을 획득해야 하지만 트랜잭션 1이 read lock을 갖고 있기 때문에 트랜잭션2는 write lock을 획득할 수 없다.
즉, Deadlock. 트랜잭션 1은 x에 대해 lock을 얻지 못하고, 트랜잭션2는 y에 대해 lock을 얻지 못한다.