데이터베이스 기초
트랜잭션의 동시성 제어에 사용되는 2단계 로킹 방식에 대한 설명으로 올바른 것은?
- A각 트랜잭션은 락을 거는 단계와 해제하는 단계를 몇 번 반복해도 된다. 이로써 데드락이 일어나지 않음이 보장된다
- B읽기에는 락을 걸지 않고 쓰기에만 락을 건다. 이로써 더티 리드를 포함한 모든 문제를 막을 수 있다
- C각 트랜잭션은 락을 하나라도 해제하면 그 이후에는 새로운 락을 걸지 않는다. 이로써 동시에 실행해도 직렬로 실행한 경우와 같은 결과가 됨이 보장되지만, 데드락은 일어날 수 있다
정답과 해설 보기
정답: C. 각 트랜잭션은 락을 하나라도 해제하면 그 이후에는 새로운 락을 걸지 않는다. 이로써 동시에 실행해도 직렬로 실행한 경우와 같은 결과가 됨이 보장되지만, 데드락은 일어날 수 있다
2단계 로킹 방식(2PL)에서는 각 트랜잭션이 필요한 락을 차례로 걸어 가는 단계(확장 단계)와 락을 해제해 가는 단계(축소 단계)의 두 단계를 가지며, 일단 락을 해제하기 시작하면 새로운 락은 걸지 않습니다. 모든 트랜잭션이 이 규칙을 지키면, 동시에 실행했을 때의 결과가 트랜잭션을 어떤 순서로 하나씩 실행한 경우와 같아지는 것(직렬 가능성)이 보장됩니다. 다만 두 트랜잭션이 서로 상대의 락 해제를 기다리는 데드락은 막을 수 없으므로, DBMS는 데드락을 감지하여 한쪽을 롤백하는 등의 대처를 합니다. 실제로는 커밋할 때까지 배타 락을 해제하지 않는 엄격한 2단계 로킹 방식이 자주 사용되며, 다른 트랜잭션이 커밋되지 않은 데이터를 읽는 것도 막습니다.