Requisitos: Existem muitas razões pelas quais o banco de dados SQL Server causa bloqueios; em produção, todos podem enfrentar problemas de bloqueio, e a causa específica pode não ser localizada apenas com base nas informações anormais dos bloqueios de aplicação, por isso é necessário usar eventos de extensão no SQL Server para rastrear problemas de bloqueio e registrar os detalhes específicos de quando eles ocorrem.
Visão geral do evento estendido
Extended Events é um recurso leve de monitoramento de desempenho que permite aos usuários coletar os dados necessários para monitorar e resolver problemas. Esse recurso permite que você visualize detalhes sobre as operações internas do motor de dados para monitoramento de desempenho e resolução de problemas.
Com a arquitetura de Eventos Estendidos (XEvents), os usuários podem usar tanto ou tão poucos dados quanto precisarem para monitorar, identificar ou solucionar problemas do desempenho do SQL Server, Azure SQL Database e Azure SQL Managed Instance. Eventos estendidos são altamente configuráveis, leves e escaláveis bem.
Referência:
O login do hiperlink está visível.
O login do hiperlink está visível.
Causas dos impasses
Bloqueios são causados por bloqueios de concorrência concorrentes em um banco de dados, geralmente em transações em múltiplas etapas. Cada sessão de usuário pode ter uma ou mais tarefas rodando em seu nome, onde cada tarefa pode buscar ou esperar para buscar vários recursos. Os seguintes tipos de recursos podem causar bloqueios e, eventualmente, causar um impasse.
- Bloqueios: Bloqueios esperando para buscar recursos como objetos, páginas, linhas, metadados e aplicações podem causar bloqueios. Por exemplo, a transação T1 tem um bloqueio compartilhado (bloqueio S) na linha r1 e espera obter um bloqueio exclusivo (bloqueio X) para a linha r2. A transação T2 tem um bloqueio compartilhado (bloqueio S) na linha r2 e espera obter um bloqueio exclusivo (bloqueio X) para a linha r1. Isso resulta em um loop de bloqueio onde tanto T1 quanto T2 esperam um ao outro liberar o recurso travado.
- Threads de trabalho: Tarefas que fazem fila para threads de trabalho disponíveis podem causar bloqueios. Se uma tarefa em fila tiver um recurso que bloqueia todas as threads de trabalhadores, isso resultará em um bloqueio. Por exemplo, após a sessão S1 iniciar uma transação e adquirir um bloqueio compartilhado (S-lock) para a linha r1, ela entra em modo de suspensão. Uma sessão ativa rodando em todos os threads de trabalho disponíveis está tentando obter um lock exclusivo (X-lock) para a linha r1. Como a sessão S1 não consegue obter uma thread de trabalho, ela não pode comprometer a transação e liberar o lock na linha r1. Isso resultará em um impasse.
- Memória: Um deadlock pode ocorrer quando uma requisição concorrente espera para obter memória e a memória disponível atualmente não é suficiente para suas necessidades. Por exemplo, duas consultas concorrentes (Q1 e Q2) são executadas como funções definidas pelo usuário, adquirindo 10 MB e 20 MB de memória, respectivamente. Se cada consulta requer 30 MB e a memória total disponível for de 20 MB, Q1 e Q2 devem esperar um ao outro liberar memória, o que resultará em um deadlock.
- Recursos relacionados à consulta paralela e execução: Coordenadores de processamento, geradores ou threads de consumo tipicamente associados a portas comutadas podem bloquear uns aos outros quando contêm pelo menos um processo que não faz parte de uma consulta paralela, resultando em bloqueios. Além disso, quando uma consulta paralela inicia a execução, o SQL Server determina o grau de paralelismo ou número de threads de trabalho com base na carga de trabalho atual. Um deadlock pode ocorrer se houver uma mudança inesperada na carga de trabalho do sistema, por exemplo, quando uma nova consulta começa a ser executada no servidor ou quando o sistema fica sem threads de trabalho.
- Recursos do Conjunto de Resultados de Múltiplas Atividades (MARS): Esses recursos são usados para controlar a execução cruzada de múltiplas solicitações de atividade sob o MARS.
Referência:
O login do hiperlink está visível.
Registro estendido de eventos por deadlock
Crie um evento de extensão para registrar as informações do deadlock com o seguinte comando:
Iniciar uma sessão de evento de bloqueio
Interrompa uma sessão de evento
Exclua uma sessão de evento
Consultar dados de sessão de eventos
Impasses de teste
Crie uma nova tabela Tab1 para testes, crie duas novas janelas de execução e execute os seguintes comandos, respectivamente:
Um impasse ocorre da seguinte forma:
Uma transação (ID de processo 68) com outro processo está travada em um recurso travado e foi selecionada como vítima de bloqueio. Por favor, refaça a transação. A transação (ID do processo 68) estava bloqueada nos recursos do bloqueio com outro processo e foi escolhida como vítima do bloqueio. Repita a transação.
Veja os dados da sessão do evento conforme mostrado na figura a seguir:
Os dados XML detalhados são os seguintes:
(Fim)
|