데이터베이스 기초
트랜잭션 T1은 행 A에 배타 락을 건 뒤 행 B의 락을 요구하고, T2는 행 B에 배타 락을 건 뒤 행 A의 락을 요구했기 때문에 둘 다 앞으로 나아갈 수 없게 되었다. DBMS가 이 상태를 감지했을 때 하는 일반적인 대처는?
- A그대로 계속 기다리게 한다. 언젠가 한쪽의 락이 자연히 해제된다
- B한쪽 트랜잭션을 롤백하여 락을 해제하게 하고, 다른 쪽을 진행시킨다
- CT1과 T2의 갱신을 둘 다 그대로 커밋한다
정답과 해설 보기
정답: B. 한쪽 트랜잭션을 롤백하여 락을 해제하게 하고, 다른 쪽을 진행시킨다
둘 이상의 트랜잭션이 서로 상대가 가진 락의 해제를 기다려 어느 것도 앞으로 나아갈 수 없게 되는 상태를 데드락(교착 상태)이라고 합니다. 이 상태는 기다리기만 해서는 해소되지 않으므로, 많은 DBMS는 어느 트랜잭션이 어느 것을 기다리는지를 나타내는 대기 그래프에 사이클이 생긴 것 등으로 데드락을 감지하고, 한쪽(희생자)을 롤백하여 락을 해제하게 합니다. 롤백된 트랜잭션은 나중에 다시 실행합니다. 락을 기다리는 시간에 상한(타임아웃)을 두어, 넘으면 롤백하는 방법도 있습니다. 예방책으로는 모든 트랜잭션이 행 A 다음에 행 B처럼 정해진 순서로 락을 걸도록 하는 방법이 효과적입니다.