다음을 통해 공유


MSSQLSERVER_1205

적용 대상: SQL Server Azure SQL 데이터베이스 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)로 행에 액세스하도록 하는 것이 좋습니다. 이렇게 하면 차단이 발생할 수 있지만 교착 상태는 방지됩니다.

자세한 내용은 교착 상태 처리 및 교착 상태 최소화를 참조하세요.