MSSQL no Windows: 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.Windows.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)

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 detectado *** == Processo 7 escolhido como vítima de deadlock == Deadlock detectado em: 1998-09-10 16:39:29.17 == Informações do participante da sessão: SPID: 7 ECID: 0 Tipo de instrução: ATUALIZAR Entrada Buf: atualizar t1 conjunto c1 = c1 no qual c1 = 2 SPID: 8 ECID: 0 Tipo de instrução: ATUALIZAR Entrada Buf: atualizar t1 conjunto c1 = c1 no qual c1 = 1 == Informações do participante do Bloqueio de Deadlock: == Bloqueio: CHAVE: 2:117575457:1 (010001000000) Banco de dados: tempdb Tabela: t1 Índice: i1 - Mantido por: SPID 7 ECID 0 Modo "S" - Solicitado por: SPID 8 ECID 0 Modo "X" == Bloqueia: CHAVE: 2:117575457:1 (020002000000) Banco de dados: tempdb Tabela: t1 Índice: i1 - Mantido por: SPID 8 ECID 0 Modo "S" - Solicitado por: SPID 7 ECID 0 Modo "X"

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

Parâmetros Substituíveis

Nome

Descrição

Valor Padrão

Habilitado

Habilita ou desabilita o fluxo de trabalho.

Sim

Intervalo (segundos)

O intervalo de tempo recorrente em segundos no qual executar o fluxo de trabalho.

300

Prioridade

Define a Prioridade do Alerta.

1

Gravidade

Define a Severidade do Alerta.

1

Tempo de Sincronização

Tempo de Sincronização

 

Tempo Limite (em segundos)

Especifica o tempo que o fluxo de trabalho pode para ser executado antes de ser fechado e marcado como falha.

200

Tempo limite da conexão de banco de dados (segundos)

O fluxo de trabalho falhará e registrará um evento, se ele não conseguir acessar o banco de dados durante o período especificado.

15

Element properties:

TargetMicrosoft.SQLServer.Windows.DBEngine
CategoryEventCollection
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
RemotableTrue
Alert Message
MSSQL no Windows: 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}
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.Windows.DataSource.EventCollectionFiltered Default
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<Rule ID="Microsoft.SQLServer.Windows.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="SqlDiscW!Microsoft.SQLServer.Windows.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.Windows.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>
<MonitoringType>$Target/Property[Type="SqlDiscW!Microsoft.SQLServer.Windows.DBEngine"]/MonitoringType$</MonitoringType>
<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.Windows.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>