Estou solucionando um problema que parece ser aleatório
O problema é que às vezes um aplicativo (dynamics SL) está congelando
Quando o aplicativo está congelando, noto que há um bloqueador no monitor de atividade do SQL e um bloqueador de cabeça
no meu entendimento limitado, o bloqueador de cabeça significa que uma sessão está em execução no momento e está bloqueando um recurso e esse recurso também é necessário para outra sessão. portanto, todas as sessões que precisam de acesso a esse recurso não podem continuar, portanto, o "bloqueado por" que vejo no monitor de atividades
minha pergunta é em cinco casos que eu vi é que o status da tarefa do bloqueador de cabeça está realmente em branco. geralmente um status de tarefa é "em execução" ou "suspenso" agora como uma sessão que não está em execução se torna o bloqueador de cabeça?
Estou pensando que minha compreensão do bloqueador de cabeça talvez esteja errada. mas por favor me iluminou estilo ELI5 :)
cada um dos 5 casos. Acabei de matar o processo do bloqueador de cabeça. então todo mundo não está mais congelando.
Espero identificar a fonte desse bloqueador de cabeça e encontrar uma solução
Quando clico nos detalhes do bloqueador de cabeça. tudo que eu vejo é
select @@identity
por favor, avise?
obrigada
Na verdade, para bloquear uma sessão, basta manter um bloqueio em um recurso que outra coisa deseja. Na verdade, não precisa estar fazendo nada. Por exemplo, se você executar o seguinte
E não execute um COMMIT, pois você deixará uma transação aberta. A sessão não está fazendo nada e, na verdade, não aparecerá no
sys.dm_exec_requests
. No entanto, os bloqueios continuarão sendo mantidos e continuarão a bloquear outras sessões. Você pode encontrar as informações sobre transações abertas emsys.dm_tran_session_transactions
.O próximo ponto é o comando que você está vendo. Esse é apenas o último lote da sessão. Se você abrir uma transação e executar vários lotes nela, pode muito bem estar mantendo bloqueios de comandos anteriores que não serão exibidos.
Eu escrevi sobre essas duas coisas com um pouco mais de detalhes nos links a seguir:
Transações: quem o quê e onde
Usar sys.dm_exec_sql_text para descobrir o bloqueio às vezes é falho.
Além disso, o primeiro link terá informações sobre como encontrar quem está executando/executou a transação incorreta. Frequentemente, descubro que, se o login for compartilhado ou um ID SQL, posso rastrear o indivíduo usando as informações na coluna host_name de
sys.dm_exec_sessions
.