Como podemos verificar quais bloqueios de banco de dados são aplicados em quais linhas em um lote de consulta?
Alguma ferramenta que destaca o bloqueio no nível da linha da tabela em tempo real?
DB: SQL Server 2005
fonte
Como podemos verificar quais bloqueios de banco de dados são aplicados em quais linhas em um lote de consulta?
Alguma ferramenta que destaca o bloqueio no nível da linha da tabela em tempo real?
DB: SQL Server 2005
Para adicionar às outras respostas, sp_lock
também pode ser usado para despejar informações completas de bloqueio em todos os processos em execução. A saída pode ser esmagadora, mas se você quiser saber exatamente o que está bloqueado, é uma tarefa valiosa para executar. Eu costumo usá-lo junto sp_who2
para rapidamente me concentrar nos problemas de bloqueio.
Existem várias versões diferentes de sp_lock
procedimentos "mais amigáveis" disponíveis online, dependendo da versão do SQL Server em questão.
No seu caso, para o SQL Server 2005, ele sp_lock
ainda está disponível, mas está obsoleto. Portanto, agora é recomendável usar a sys.dm_tran_locks
exibição para esse tipo de coisa. Você pode encontrar um exemplo de como "rolar sua própria" função sp_lock aqui .
Isso não mostra exatamente quais linhas estão bloqueadas, mas isso pode ser útil para você.
Você pode verificar quais instruções estão bloqueadas executando este:
select cmd,* from sys.sysprocesses
where blocked > 0
Também informará o que cada bloco está esperando. Portanto, você pode rastrear isso até ver qual instrução causou o primeiro bloco que causou os outros blocos.
Edite para adicionar comentário de @MikeBlandford :
A coluna bloqueada indica o spid do processo de bloqueio. Você pode executar o kill {spid} para corrigi-lo.
Você pode encontrar bloqueios atuais na sua tabela seguindo a consulta.
Consulte sys.dm_tran_locks
Se existirem várias instâncias do mesmo request_owner_type , a coluna request_owner_id será usada para distinguir cada instância. Para transações distribuídas, as colunas request_owner_type e request_owner_guid mostrarão as diferentes informações da entidade.
Por exemplo, a Sessão S1 possui um bloqueio compartilhado na Tabela1; e a transação T1, que está sendo executada na sessão S1, também possui um bloqueio compartilhado na Tabela1. Nesse caso, a coluna resource_description retornada por sys.dm_tran_locks mostrará duas instâncias do mesmo recurso. A coluna request_owner_type mostrará uma instância como uma sessão e a outra como uma transação. Além disso, a coluna resource_owner_id terá valores diferentes.
fonte
Eu uso um Dynamic Management View (DMV) para capturar bloqueios, bem como o object_id ou partition_id do item que está bloqueado.
(DEVE mudar para o banco de dados que você deseja observar para obter object_id)
fonte
sp_who2
e entrandosys.dm_os_waiting_task
(ambas tentando atualizar a mesma tabela). Mas sua declaração não retorna nenhuma linha. Alguma ideia?Você também pode usar o
sp_who2
procedimento armazenado interno para obter os processos atuais de bloqueio e bloqueio em uma instância do SQL Server. Normalmente, você executaria isso ao lado de uma instância do SQL Profiler para encontrar um processo de bloqueio e observar o comando mais recente que spid emitido no profiler.fonte
Você pode encontrar detalhes através do script abaixo.
fonte