MSSQLSERVER_1205
적용 대상: SQL ServerAzure SQL Database Azure SQL Managed Instance
세부 정보
attribute | 값 |
---|---|
제품 이름 | SQL Server |
이벤트 ID | 1205 |
이벤트 원본 | MSSQLSERVER |
구성 요소 | SQLEngine |
심볼 이름 | LK_VICTIM |
메시지 텍스트 | 트랜잭션(프로세스 ID %d)이 %.*ls 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행합니다. |
설명
리소스는 별도의 트랜잭션에서 충돌하는 순서로 액세스되어 교착 상태가 발생합니다. 예시:
- Transaction1은 Table1.Row1을 업데이트하고 Transaction2는 Table2.Row2를 업데이트합니다.
- Transaction1은 Table2.Row2를 업데이트하려고 하지만 Transaction2가 아직 커밋되지 않았고 잠금을 해제하지 않았기 때문에 차단됩니다.
- 이제 Transaction2가 Table1.Row1을 업데이트하려고 시도하지만 Transaction1이 커밋되지 않았고 잠금을 해제하지 않았기 때문에 차단됩니다.
- Transaction1이 Transaction2가 완료 될 때까지 기다리고 있지만 Transaction2가 Transaction1이 완료 될 때까지 기다리고 있기 때문에 교착 상태가 발생합니다.
시스템은 이 교착 상태를 감지하고 '피해자'로 관련된 트랜잭션 중 하나를 선택합니다. 그런 다음 이 오류 메시지를 실행하여 피해자의 트랜잭션을 롤백합니다. 자세한 내용은 교착 상태를 참조 하세요.
사용자 작업
교착 상태는 대부분의 경우 애플리케이션 관련 문제이며 애플리케이션 개발자가 코드를 변경해야 합니다. 오류 1205를 수신하는 한 가지 방법은 쿼리를 다시 실행하는 것입니다. 교착 상태를 처리하고 쿼리 를 다시 실행하는 방법의 예는 이 블로그를 참조하세요. 개발자용 교착 상태 시뮬레이터 앱: 앱에서 SQL 교착 상태 문제를 처리하는 방법
교착 상태를 방지하기 위해 애플리케이션을 수정할 수도 있습니다. 피해자로 선택한 트랜잭션은 다시 시도될 수 있으며 동시에 실행되는 작업에 따라 성공할 가능성이 높습니다.
교착 상태를 방지하거나 피하려면 모든 트랜잭션이 동일한 순서(Table1 이후 Table2)로 행에 액세스하도록 하는 것이 좋습니다. 이렇게 하면 차단이 발생할 수 있지만 교착 상태는 방지됩니다.
자세한 내용은 교착 상태 처리 및 교착 상태 최소화를 참조하세요.