MSSQL 2014: A transação foi bloqueada com deadlock nos recursos em outro processo e foi escolhida como vítima do deadlock. Execute a transação novamente

Microsoft.SQLServer.2014.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule (Rule)

Este erro ocorre quando o Microsoft® SQL Server™ encontra um deadlock. Um deadlock ocorre quando dois (ou mais) processos tentam acessar um recurso bloqueado pelo outro processo. Como cada processo tem uma solicitação para outro recurso, nenhum processo pode ser concluído. Quando um deadlock é detectado, o SQL Server reverte o comando com o tempo de processamento mínimo e retorna a mensagem de erro 1205 ao aplicativo cliente. Esse erro não é fatal e talvez não resulte no encerramento do lote.

Knowledge Base article:

Resumo

Este erro ocorre quando o Microsoft® SQL Server™ encontra um deadlock. Um deadlock ocorre quando dois (ou mais) processos tentam acessar um recurso bloqueado pelo outro processo. Como cada processo tem uma solicitação para outro recurso, nenhum processo pode ser concluído. Quando um deadlock é detectado, o SQL Server reverte o comando com o tempo de processamento mínimo e retorna a mensagem de erro 1205 ao aplicativo cliente. Esse erro não é fatal e talvez não resulte no encerramento do lote.

Resoluções

Em algumas instâncias, uma condição de deadlock fará com que uma função DB-Library (como dbsqlexec, dbsqlok, dbresults ou dbnextrow) retorne FAIL. O programa sempre será responsável por verificar os códigos de retorno de cada função DB-Library. Se FAIL for retornado por uma dessas funções DB-Library, o programa deverá cancelar o lote e não tentará continuar. Em alguns casos, é possível continuar a execução de funções subsequentes no lote. No entanto, como ocorreu uma situação de deadlock e as funções que a causaram foram revertidas, as funções posteriores no lote provavelmente falharão com um erro mais grave, como "objeto não encontrado".

Em outras instâncias, uma condição de deadlock não fará com que uma função DB-Library retorne FAIL. Nesses casos, o programa deve procurar a mensagem de erro 1205 no manipulador de mensagens e usar a função dbsetuserdata para comunicar essa informação ao aplicativo. Em seguida, o programa deverá procurar o indicador de deadlock após cada chamada DB-Library e cancelar o lote se um deadlock for detectado.

Embora possa parecer desnecessário cancelar um lote após o recebimento da mensagem de deadlock 1205, esse procedimento é necessário porque o servidor nem sempre encerra o lote em uma situação de deadlock. Se o lote não for cancelado, todas as tentativas de envio de um novo lote poderão resultar no erro DB-Library 10038, "Resultados Pendentes".

Você também pode usar a instrução SET DEADLOCK_PRIORITY (LOW ou NORMAL). SET DEADLOCK_PRIORITY controla como a sessão reage em uma situação de deadlock. Se estiver definido como LOW, o processo será a vítima preferencial de uma situação de deadlock. Se estiver definido como NORMAL, a sessão usará o método padrão de manipulação de deadlock.

Se a situação de deadlock continuar, é sempre útil usar o sinalizador de rastreamento 1204 para reunir mais informações. O sinalizador de rastreamento 1204 imprime as cadeias e vítimas de deadlocks, conforme nesta saída de amostra:

*** Deadlock Detected *** == Process 7 chosen as deadlock victim == Deadlock Detected at: 1998-09-10 16:39:29.17 == Session participant information: SPID: 7 ECID: 0 Statement Type: UPDATE Input Buf: update t1 set c1 = c1 where c1 = 2 SPID: 8 ECID: 0 Statement Type: UPDATE Input Buf: update t1 set c1 = c1 where c1 = 1 == Deadlock Lock participant information: == Lock: KEY: 2:117575457:1 (010001000000) Database: tempdb Table: t1 Index: i1 - Held by: SPID 7 ECID 0 Mode "S" - Requested by: SPID 8 ECID 0 Mode "X" == Lock: KEY: 2:117575457:1 (020002000000) Database: tempdb Table: t1 Index: i1 - Held by: SPID 8 ECID 0 Mode "S" - Requested by: SPID 7 ECID 0 Mode "X"

Essas informações de deadlock podem ser interpretadas da seguinte maneira:

Parâmetros Substituíveis

Nome

Descrição

Valor padrão

Habilitado

 

Sim

Gerar Alertas

 

Sim

Prioridade

 

1

Gravidade

 

1

Element properties:

TargetMicrosoft.SQLServer.2014.DBEngine
CategoryEventCollection
EnabledTrue
Event_ID1205
Event Source$Target/Property[Type="SQL2014Core!Microsoft.SQLServer.2014.DBEngine"]/ServiceName$
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
RemotableTrue
Alert Message
MSSQL 2014: A transação foi bloqueada com deadlock nos recursos em outro processo e foi escolhida como vítima do deadlock. Execute a transação novamente
{0}
Event LogApplication
CommentMom2014ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2014GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}

Member Modules:

ID Module Type TypeId RunAs 
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ DataSource Microsoft.Windows.EventProvider Default
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<Rule ID="Microsoft.SQLServer.2014.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule" Target="SQL2014Core!Microsoft.SQLServer.2014.DBEngine" Enabled="true" ConfirmDelivery="true" Remotable="true" Comment="Mom2014ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2014GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Windows!Microsoft.Windows.EventProvider">
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<LogName>Application</LogName>
<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>PublisherName</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>$Target/Property[Type="SQL2014Core!Microsoft.SQLServer.2014.DBEngine"]/ServiceName$</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>EventDisplayNumber</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>1205</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</And>
</Expression>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="SystemHealth!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>1</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.2014.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>$Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>