MSSQL on Linux: 트랜잭션 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행하세요.

Microsoft.SQLServer.Linux.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule (Rule)

이 오류는 Microsoft SQL Server에 교착 상태가 나타날 때 발생합니다. 교착 상태는 둘 이상의 프로세스가 다른 프로세스에서 잠근 리소스에 액세스를 시도할 때 발생합니다. 각 프로세스에서 다른 리소스를 요청하기 때문에 어느 프로세스도 완료할 수 없습니다. 교착 상태가 검색되면 SQL Server는 처리 시간이 가장 적게 소요되는 명령을 롤백하고 클라이언트 응용 프로그램에 오류 메시지 1205를 반환합니다. 이 오류는 치명적이지 않으며 일괄 처리를 종료시키지 않습니다.

Knowledge Base article:

요약

이 오류는 Microsoft SQL Server에 교착 상태가 나타날 때 발생합니다. 교착 상태는 둘 이상의 프로세스가 다른 프로세스에서 잠근 리소스에 액세스를 시도할 때 발생합니다. 각 프로세스에서 다른 리소스를 요청하기 때문에 어느 프로세스도 완료할 수 없습니다. 교착 상태가 검색되면 SQL Server는 처리 시간이 가장 적게 소요되는 명령을 롤백하고 클라이언트 응용 프로그램에 오류 메시지 1205를 반환합니다. 이 오류는 치명적이지 않으며 일괄 처리를 종료시키지 않습니다.

해결 방법

예를 들어 교착 상태 조건은 DB-Library 함수(예: dbsqlexec, dbsqlok, dbresults 또는 dbnextrow)가 FAIL을 반환하도록 합니다. 각 DB-Library 함수의 반환 코드를 확인하는 것은 항상 프로그램이 담당합니다. 이러한 DB-Library 함수 중 하나에서 FAIL이 반환된 경우 프로그램은 일괄 처리를 취소하고 작업을 계속 진행해서는 안됩니다. 일부의 경우에는 일괄 처리에서 다음 함수를 계속 실행할 수 있습니다. 그러나 교착 상태 상황이 발생하고 원인이 되는 함수가 롤백되었기 때문에 일괄 처리에서 나중의 함수는 "개체를 찾을 수 없습니다" 같은 보다 중대한 오류로 인해 실패할 수 있습니다.

다른 경우에는 교착 상태 조건으로 인해 DB-Library 함수가 FAIL을 반환하지 않습니다. 이 경우 프로그램은 메시지 처리기에서 오류 메시지 1205를 확인하고 dbsetuserdata 함수를 사용하여 응용 프로그램에 이 문제를 알려야 합니다. 그런 다음 프로그램은 모든 DB-Library 호출 후에 교착 상태 표시기를 확인하고 교착 상태가 발견되면 일괄 처리를 취소해야 합니다.

1205 교착 상태 메시지를 받은 후에 일괄 처리를 반드시 취소할 필요가 없는 것처럼 보일 수 있지만 교착 상태 상황에서 서버가 일괄 처리를 종료하지 않을 수 있으므로 일괄 처리를 취소해야 합니다. 일괄 처리가 취소되지 않은 경우 새 일괄 처리를 제출하려고 하면 DB-Library 오류 10038 "결과 보류 중" 오류가 발생할 수 있습니다.

SET DEADLOCK_PRIORITY 문(LOW 또는 NORMAL)도 사용할 수 있습니다. SET DEADLOCK_PRIORITY는 교착 상태 상황이 발생할 때 세션이 어떻게 반응할지를 제어합니다. LOW로 설정하면 프로세스에 교착 상태 상황이 발생할 경우 실행이 중지됩니다. NORMAL로 설정하면 세션은 기본 교착 상태 처리 방법을 사용합니다.

교착 상태 상황이 계속되면 추적 플래그 1204를 사용하여 자세한 정보를 수집하는 것이 좋습니다. 추적 플래그 1204는 다음 예제 출력에서 볼 수 있는 것과 같은 교착 상태 체인과 교착 상태가 발생하여 중지된 프로세스를 인쇄합니다.:

*** 교착 상태 검색됨 *** == 교착 상태가 발생하여 프로세스 7의 실행이 중지됨 == 교착 상태 검색 시간: 1998-09-10 16:39:29.17 == 세션 참가자 정보: SPID: 7 ECID: 0 문 유형: UPDATE 입력 버퍼: update t1 set c1 = c1 where c1 = 2 SPID: 8 ECID: 0 문 유형: UPDATE 입력 버퍼: update t1 set c1 = c1 where c1 = 1 == 교착 상태 잠금 참가자 정보: == 잠금: KEY: 2:117575457:1 (010001000000) 데이터베이스: tempdb 테이블: t1 Index: i1 - 소유자: SPID 7 ECID 0 Mode "S" - 요청자: SPID 8 ECID 0 Mode "X" == Lock: KEY: 2:117575457:1 (020002000000) 데이터베이스: tempdb 테이블: t1 Index: i1 - 소유자: SPID 8 ECID 0 Mode "S" - 요청자: SPID 7 ECID 0 Mode "X"

이 교착 상태 정보는 다음과 같이 해석할 수 있습니다.:

재정의 가능한 매개 변수

이름

설명

기본값

사용

워크플로 사용하거나 사용하지 않도록 설정합니다.

간격(초)

워크플로를 실행하는 반복 시간 간격(초)입니다.

300

우선 순위

알림 우선 순위를 정의합니다.

1

심각도

알림 심각도를 정의합니다.

1

동기화 시간

동기화 시간

 

시간 제한(초)

여기서 지정한 시간 동안 워크플로가 실행된 후 워크플로가 닫히고 실패로 표시됩니다.

200

데이터베이스 연결 시간 제한(초)

워크플로는 지정된 기간 동안 데이터베이스에 액세스할 수 없으면 실패하며 이벤트를 등록합니다.

15

Element properties:

TargetMicrosoft.SQLServer.Linux.DBEngine
CategoryEventCollection
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
RemotableTrue
Alert Message
MSSQL on Linux: 트랜잭션 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행하세요.
{0}
CommentMom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}

Member Modules:

ID Module Type TypeId RunAs 
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ DataSource Microsoft.SQLServer.Linux.DataSource.EventCollectionFiltered Default
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<Rule ID="Microsoft.SQLServer.Linux.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule" Target="SqlDiscL!Microsoft.SQLServer.Linux.DBEngine" Enabled="true" ConfirmDelivery="true" Remotable="true" Comment="Mom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Microsoft.SQLServer.Linux.DataSource.EventCollectionFiltered">
<MachineName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</MachineName>
<NetbiosComputerName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/NetbiosComputerName$</NetbiosComputerName>
<InstanceName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</InstanceName>
<ConnectionString>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/ConnectionString$</ConnectionString>
<InstanceVersion>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Version$</InstanceVersion>
<InstanceEdition>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Edition$</InstanceEdition>
<SqlExecTimeoutSeconds>60</SqlExecTimeoutSeconds>
<SqlTimeoutSeconds>15</SqlTimeoutSeconds>
<TimeoutSeconds>200</TimeoutSeconds>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<EventDisplayNumber>1205</EventDisplayNumber>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="Health!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>1</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.Linux.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule.AlertMessage"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</AlertParameter1>
<AlertParameter2>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</AlertParameter2>
<AlertParameter3>Event ID: $Data/Property[@Name='EventID']$. $Data/Property[@Name='Message']$</AlertParameter3>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>