Deadlocks são um problema comum no SQL Server que podem fazer com que transações falhem e impactem o desempenho do seu banco de dados. Neste artigo, exploraremos as etapas necessárias para identificar e resolver deadlocks no SQL Server.
Etapa 1: Habilitar a Flag de Rastreamento de Deadlocks
O primeiro passo para resolver deadlocks é habilitar a flag de rastreamento de deadlocks no SQL Server. Isso pode ser feito usando o seguinte comando:
DBCC traceon(1204,-1)
Ao habilitar essa flag de rastreamento, os detalhes dos deadlocks serão capturados no log de erros do SQL Server.
Etapa 2: Coletar Detalhes dos Deadlocks
Uma vez que a flag de rastreamento esteja habilitada, você pode coletar os detalhes dos deadlocks no log de erros do SQL usando o comando ‘xp_readerrorlog’.
xp_readerrorlog
Isso fornecerá informações sobre os deadlocks que ocorreram, incluindo os processos e as instruções envolvidas.
Etapa 3: Identificar as Instruções de Deadlock
A partir dos detalhes dos deadlocks capturados, você pode identificar as instruções que estão causando os deadlocks. No exemplo, os deadlocks estavam ocorrendo devido a instruções de UPDATE em um procedimento armazenado.
Etapa 4: Revisar o Código do Procedimento Armazenado
Em seguida, você deve revisar o código do procedimento armazenado que está causando os deadlocks. No exemplo, o procedimento armazenado estava chamando vários outros procedimentos, o que dificultava a identificação das instruções de deadlock.
Etapa 5: Usar Números de Página para Identificar as Instruções de Deadlock
Se for difícil identificar as instruções de deadlock diretamente do código do procedimento armazenado, você pode usar os números de página dos detalhes do deadlock para localizar as instruções. Usando o comando não documentado ‘DBCC Page’, você pode recuperar o nome da tabela associada ao deadlock.
DBCC page(database_id, file_id, page_id, 0)
Esse comando fornecerá o nome do objeto associado à página, ajudando a identificar as instruções de deadlock.
Etapa 6: Revisar Procedimentos Armazenados Dependentes
Depois de identificar as instruções de deadlock, você deve revisar o código dos procedimentos armazenados dependentes da tabela. No exemplo, foi encontrado um procedimento de atualização que estava causando os deadlocks.
Etapa 7: Verificar Índices
É importante verificar os índices na tabela para garantir um desempenho ideal. No exemplo, foi constatado que a tabela não possuía um índice na coluna ID, o que fazia com que a atualização realizasse uma varredura completa da tabela e resultasse em deadlocks.
Etapa 8: Criar Índices
Para resolver os deadlocks, você pode criar os índices necessários na tabela. No exemplo, foi criado um índice clusterizado na coluna ID usando o seguinte comando:
CREATE CLUSTERED INDEX IX_Clustered_index_column ON dbo.TABLE(ID) ON [PRIMARY]
Após criar o índice, os deadlocks foram resolvidos, pois o bloqueio exclusivo de intenção não era mais solicitado em todas as páginas da instrução de atualização.
Conclusão
Deadlocks podem ocorrer no SQL Server quando várias transações estão tentando acessar os mesmos recursos simultaneamente. Ao seguir as etapas descritas neste artigo, você pode identificar e resolver deadlocks no seu banco de dados do SQL Server. É importante revisar o código do seu procedimento armazenado, verificar os índices e criar os índices necessários para otimizar o desempenho e evitar deadlocks.