이 두 질의 구문 실행 프로세스가 거의 동시에 실행되면서 다음과 같이 락이 걸리면 어떻게 될까요?
1. 질의 구문 1: 레코드 A
2. 질의 구문 2: 레코드 B
3. 질의 구문 1: 레코드 B → 대기 발생
4. 질의 구문 2: 레코드 A → 대기 발생
안타깝게도 데드락이 발생합니다. 멀티스레드 프로그래밍과 차이점이 있다면, 두 질의 구문 프로세스 중 하나는 몇 분간 대기하다가 오류를 출력한다는 점입니다.
▲ 그림 7-24 질의 구문 실행 프로세스가 데드락을 일으킴
이때 우리가 할 일은 다음과 같습니다.
두 질의 구문은 반드시 레코드 A → B 순서로 액세스한다.
그러나 이것이 말처럼 쉽지는 않습니다. 트랜잭션을 사용한다는 자체가 여러분이 의도하는 프로그래밍이 웬만큼 복잡한 처리를 해야 한다는 의미입니다. 레코드 A·B를 액세스할 때 프라이머리 키 순서대로 액세스하면 이론적으로는 교착 상태가 생기지 않습니다만, 질의 구문을 다루다 보면 사실 그럴 여력이 잘 없습니다.