Deadlocks no SQL Server 2008, o que fazer para resolvê-los?


por Roberto Cavalcanti


Existe uma percepção equivocada de que os deadlocks que ocorrem no SQL Server são um “problema” causado pelo SQL Server Engine . Na verdade esse é um recurso do produto. Existe um mecanismo que encontra e “mata” uma das tarefas (tasks) que estão em deadlock. Ele se chama SQL Server Database Engine deadlock monitor e é um recurso que evita problemas de concorrência entre as transações gerenciadas pelo SQL Server. Após o deadlock monitor matar uma das tasks e gerar um erro, ocorre o rollback da transação que é considerada a vítima (“deadlock victm”). Esse procedimento permite que o desempenho da sua aplicação não seja tão afetado por uma falta de tratamento de erros em seu código. 


O controle de concorrência é um recurso fundamental para o bom funcionamento de um Sistema de Gerenciamento de Bancos de Dados Relacionais (SGBD). Graças ao deadlock monitor a task (ou SPID) vencedora pode continuar a execução das suas transações sem que seja necessário reiniciar o servidor.


Para detectar dentro do seu código o momento em que um deadlock está ocorrendo, capture o evento de erro 1205 que é retornado pelo SQL Server e trate-o de acordo com as regras de negócios pertinentes à sua aplicação.


Segue um script de exemplo de como tratar deadlocks em T-SQL:


TentaNovamente:
SET @NumTentativas += 1 — incrementa o contador

BEGIN TRY
BEGIN TRANSACTION
UPDATE Production.Product SET ListPrice = 09.99 WHERE ProductID = 1
UPDATE Production.Product SET ListPrice = 04.99 WHERE ProductID = 2
COMMIT TRANSACTION
END TRY

BEGIN CATCH
SET @Err = @@ERROR
IF @Err = 1205 — um deadlock foi detectado
BEGIN
ROLLBACK TRANSACTION
WAITFOR DELAY ’00:00:05′
PRINT ‘Aconteceu um deadlock!, tentativa ‘ + CAST(@NumTentativas AS CHAR(1)) — insira aqui o que você quer fazer para avisar ao usuario sobre a nova tentativa, etc.
IF @NumTentativas < @MaxPermitido — testa quantas vezes tentaremos de novo
GOTO TentaNovamente; — tenta executar o update novamente
END
END CATCH


Para detalhes mais específicos de como detectar e solucionar os deadlocks, veja esses artigos do Books Online Deadlocking, Minimizing Deadlocks, Handling Deadlocks, Detecting and Ending Deadlocks


O SQL Server oferece todo o controle para que você evite problemas de concorrência. Cabe agora a você tirar proveito desses recursos!


 




Comments (1)

  1. liliana pereira says:

    Ola, achei o código fantastico e muito util so que eu estou a usar o sql server 2000, por que tem mesmo que ser, e algum codigo da erro, se calhar nao é compactivel!

    Podes ajudar me?