Freigeben über


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 OnlineDeadlocking, 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

  • Anonymous
    March 30, 2010
    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?