
294
러닝 SQL
이처럼 두 트랜잭션이 (데이터베이스 서버에서 사용 중인 잠금 단위에 따라 ) 동일한 페이지 또
는 행을 수정할 경우, 각 트랜잭션은 다른 트랜잭션이 완료되고 필요한 리소스를 확보할 때까
지 영원히 기다립니다. 따라서 데이터베이스 서버는 서비스가 중단되지 않도록 이러한 상황을
항상 주의해야 합니다. 일단 교착 상태가 감지되면 트랜잭션 중 하나를 (임의로 또는 일부 기
준에 따라 ) 선택해서 다른 트랜잭션이 진행될 수 있도록 롤백합니다. 대부분의 경우 종료된 트
랜잭션은 다시 시작할 수 있으므로 다른 교착 상태가 발생하지 않고 성공합니다.
데이터베이스 서버는 교착 상태 감지로 인해 트랜잭션이 롤백되었음을 알리는 오류를 발생시
킵니다. 예를 들어
MySQL
의 경우 다음 메시지가 포함된 오류
1213
을 표시합니다.
Message: Deadlock found when trying to get lock; try restarting transaction
오류 메시지에서 제안한 것처럼, 교착 상태 감지로 인해 롤백된 트랜잭션을 재시도하는 것이
합리적입니다. 그러나 교착 상태가 자주 발생한다면 교착 상태의 가능성을 줄이기 위해 데이터
베이스에 액세스하는 애플리케이션을 수정해야 할 수도 있습니다. 일반적인 전략 중 하나는 거
래 데이터를 삽입하기 전에 계좌