Há muitos motivos pelos quais os aplicativos podem demorar para responder, mas se os usuários estiverem reclamando do desempenho, você pode estar lidando com um impasse do SQL Server. Felizmente, existem maneiras de identificar e corrigir o deadlock do SQL Server e até impedir que ele afete negativamente o desempenho do aplicativo.
O impasse do SQL Server é essencialmente um impasse entre dois processos que competem por acesso exclusivo ao mesmo recurso. Como apenas um processo pode usar um recurso por vez, o desempenho diminui até que o deadlock seja resolvido.
Há dois tipos de deadlocks do SQL Server a serem observados:bloqueios de conversão e bloqueios de ciclo.
Os deadlocks de bloqueio de conversão ocorrem quando um encadeamento tenta converter um bloqueio de um tipo exclusivo para outro tipo exclusivo, mas não consegue porque um encadeamento diferente já mantém um bloqueio compartilhado no recurso que o primeiro encadeamento está tentando converter.
No SQL Server, existem três tipos de bloqueios de conversão:
- Compartilhado com intenção exclusiva (SIX):Esse bloqueio ocorre quando uma transação que contém um bloqueio compartilhado também possui um bloqueio exclusivo em algumas páginas ou linhas.
- Compartilhado com atualização de intenção (SIU):esse bloqueio ocorre quando uma transação que contém um bloqueio compartilhado também tem algumas páginas ou linhas bloqueadas com um bloqueio de atualização.
- Atualização com intenção exclusiva (UIX):esse bloqueio ocorre quando uma transação que contém um bloqueio de atualização também possui um bloqueio exclusivo em algumas páginas ou linhas.
Bloqueios de ciclo são deadlocks do SQL Server causados por dois processos que disputam um bloqueio exclusivo em um recurso que está bloqueado pelo outro processo.
Por exemplo, o Processo 1 está mantendo um bloqueio no Recurso 1 enquanto espera que o Processo 2 libere seu bloqueio no Recurso 2. Se o Processo 2 está mantendo um bloqueio no Recurso 2 enquanto aguarda o Processo 1 liberar o Recurso 1, temos a nós mesmos um impasse de bloqueio de ciclo.
Como diagnosticar o impasse do SQL Server
O impasse do SQL Server é apenas uma das dezenas de possíveis motivos pelos quais seu aplicativo pode ter problemas de desempenho. Se as consultas que normalmente são executadas rapidamente ficam lentas repentinamente, é possível que você tenha um impasse. Mas também é possível que algo mais esteja acontecendo.
Então, além de notar a redução da velocidade de consulta, como você determina com certeza se o deadlock é o culpado pelos problemas de desempenho do banco de dados?
A maneira mais fácil e definitiva de identificar o impasse é a presença de uma mensagem de erro 1205:
A transação (ID do processo %d) foi bloqueada em recursos %.*ls com outro processo e foi escolhida como vítima de bloqueio. Execute novamente a transação.
A mensagem de erro 1205 diz literalmente que há um impasse e como corrigi-lo. No entanto, como aponta Jeremiah Peschka, se você não corrigiu a causa do impasse, a reexecução da transação provavelmente não será bem-sucedida.
Outra opção para localizar deadlocks é extrair um gráfico de deadlock do SQL Server dos Eventos Estendidos. A extração do deadlock por meio de Extended Events permite examinar o XML de deadlock, que fornece mais informações do que a representação gráfica de um gráfico de deadlock.
O XML de deadlock é organizado pela lista de vítimas, pela lista de processos e pela lista de recursos. Cada seção fornece descrições detalhadas das vítimas, processos e recursos envolvidos no impasse, o que facilita a solução de problemas e a resolução do problema.
Como corrigir o impasse do SQL Server
A única maneira de resolver um deadlock do SQL Server é encerrar um dos processos e liberar o recurso bloqueado para que o processo possa ser concluído. Isso ocorre automaticamente quando o SQL Server detecta um deadlock e elimina um dos processos concorrentes (ou seja, a vítima).
O SQL Server normalmente escolhe qual conexão matar aleatoriamente, mas é possível definir prioridades de deadlock para determinar qual conexão é interrompida durante um deadlock. Quando duas conexões têm configurações de prioridade diferentes, o SQL Server eliminará a transação com a prioridade mais baixa.
Como evitar o impasse do SQL Server
O impasse do SQL Server é um fato da vida quando você está gerenciando um banco de dados ocupado. No entanto, os DBAs podem ajudar a reduzir a ocorrência de deadlocks e minimizar seu impacto no desempenho do banco de dados tomando algumas medidas preventivas:
- Crie índices melhores
- Ajuste as prioridades da transação
- Aprovar um modelo Try/Retry
- Alterar modos de isolamento
- Segure os bloqueios pelo menor tempo possível
- Acesse recursos sempre na mesma ordem
- Não envie uma transação até que você tenha todas as informações necessárias
- Limitar escalonamento de bloqueio
Embora não seja possível evitar completamente o deadlock do SQL Server, você pode implementar essas práticas recomendadas e contornar proativamente algumas das fontes mais comuns de deadlock para manter as transações fluindo sem problemas e otimizar o desempenho do banco de dados.