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.
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.
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:
A primeira seção exibe a vítima e a hora do deadlock, juntamente com as sessões envolvidas no deadlock. Para cada sessão, o SPID atual, o tipo de instrução e uma parte do buffer de entrada são exibidos.
A segunda seção exibe detalhes sobre os bloqueios envolvidos no deadlock. Na saída acima, observe que o deadlock envolve bloqueios de chave na tabela t1, índice i1. A saída de deadlock mostra quais processos possuem os bloqueios envolvidos no deadlock e quais sessões estão aguardando os bloqueios e os modos de bloqueio associados serem concedidos.
O processo que gerou a menor quantidade de volume de log será escolhido, por padrão, como vítima de deadlock e revertido automaticamente. Para influenciar qual sessão será revertida, defina DEADLOCK_PRIORITY para uma sessão.
Nome | Descrição | Valor padrão |
Habilitado | Habilita ou desabilita o fluxo de trabalho. | Sim |
Prioridade | Define a Prioridade do Alerta. | 1 |
Gravidade | Define a Severidade do Alerta. | 1 |
Target | Microsoft.SQLServer.2016.DBEngine | ||
Category | EventCollection | ||
Enabled | True | ||
Event_ID | 1205 | ||
Event Source | $Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.DBEngine"]/ServiceName$ | ||
Alert Generate | True | ||
Alert Severity | Warning | ||
Alert Priority | Normal | ||
Remotable | True | ||
Alert Message |
| ||
Event Log | Application | ||
Comment | Mom2016ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2016GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74} |
ID | Module Type | TypeId | RunAs |
---|---|---|---|
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ | DataSource | Microsoft.Windows.EventProvider | Default |
GenerateAlert | WriteAction | System.Health.GenerateAlert | Default |
<Rule ID="Microsoft.SQLServer.2016.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule" Target="SQL2016Core!Microsoft.SQLServer.2016.DBEngine" Enabled="true" ConfirmDelivery="true" Remotable="true" Comment="Mom2016ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2016GroupID={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="SQL2016Core!Microsoft.SQLServer.2016.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.2016.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>Event ID: $Data/EventDisplayNumber$. $Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>