Where Are You Coming From Today?
Follow us on:
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 TRANSACTIONEND 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 ENDEND 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!
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?