Deadlocks no SQL Server 2008, o que fazer para resolvê-los?
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
- 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?