Como verificar quais fechaduras são mantidas em uma mesa

Como podemos verificar quais bloqueios de banco de dados são aplicados em que linhas contra um lote de consultas?

Alguma ferramenta que realce o bloqueio do nível da linha da mesa em tempo real?

DB: SQL Server 2005

Author: Somnath Muluk, 2009-03-29

5 answers

Para adicionar às outras respostas, {[[0]} também pode ser usado para despejar informação de bloqueio completo em todos os processos em execução. A saída pode ser esmagadora, mas se você quer saber exatamente o que está trancado, é um valioso para executar. Normalmente uso-o juntamente com sp_who2 para evitar rapidamente problemas de bloqueio.

Existem várias versões diferentes de procedimentos amigáveis {[[0]} disponíveis online, dependendo da versão do servidor SQL em questão.

No seu caso, para o servidor SQL 2005, {[[0]} ainda está disponível, mas desactualizado, por isso é agora recomendado usar o sys.dm_tran_locks vista para este tipo de coisa. Você pode encontrar um exemplo de como" rolar sua própria " função sp_lock aqui .

 103
Author: mwigdahl, 2013-11-15 13:55:39

Isto não está exactamente a mostrar-lhe quais as linhas que estão trancadas, mas isto pode ajudar-lhe.

Pode verificar quais as declarações que estão bloqueadas ao executar isto:

select cmd,* from sys.sysprocesses
where blocked > 0
Também lhe dirá do que cada quarteirão está à espera. Então você pode rastrear isso até ver qual declaração causou o primeiro bloco que causou os outros blocos.

editar para adicionar um comentário de @MikeBlandford:

A coluna bloqueada indica a aranha da processo de bloqueio. Podes correr o kill {spid} para arranjá-lo.

 87
Author: Brian R. Bondy, 2017-05-23 11:33:25

Eu uso uma janela de gestão dinâmica (DMV) para capturar os bloqueios, assim como o object_ ID ou o partition_id do item que está bloqueado.

(deve mudar para a base de dados que deseja observar para obter object_id)

SELECT 
     TL.resource_type,
     TL.resource_database_id,
     TL.resource_associated_entity_id,
     TL.request_mode,
     TL.request_session_id,
     WT.blocking_session_id,
     O.name AS [object name],
     O.type_desc AS [object descr],
     P.partition_id AS [partition id],
     P.rows AS [partition/page rows],
     AU.type_desc AS [index descr],
     AU.container_id AS [index/page container_id]
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_os_waiting_tasks AS WT 
 ON TL.lock_owner_address = WT.resource_address
LEFT OUTER JOIN sys.objects AS O 
 ON O.object_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions AS P 
 ON P.hobt_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units AS AU 
 ON AU.allocation_unit_id = TL.resource_associated_entity_id;
 33
Author: Jon, 2017-08-18 16:41:56

Poderá encontrar as fechaduras actuais na sua tabela se seguir a pesquisa.

USE yourdatabase;
GO

SELECT * FROM sys.dm_tran_locks
  WHERE resource_database_id = DB_ID()
  AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename');

Ver sys. dm_tran_locks

Se existirem várias instâncias da mesma request_owner_type, a coluna request_owner_id é usada para distinguir cada instância. Para as transacções distribuídas, as colunas request_owner_type e request_owner_guid irão mostrar as diferentes informações da entidade.

Por exemplo, a sessão S1 possui um bloqueio partilhado Table1; and transaction T1, which is running under session S1, also owns a shared lock on Table1. Neste caso, o resource_description coluna que é devolvida por sys.dm_tran_locks irá mostrar duas instâncias do mesmo recurso. A coluna request_owner_type irá mostrar uma instância como uma sessão e a outra como uma transacção. Além disso, a coluna resource_owner_id terá valores diferentes.

 29
Author: Somnath Muluk, 2016-08-04 10:27:35

Também pode usar o procedimento incorporado sp_who2 para bloquear e bloquear os processos actuais numa instância de servidor SQL. Normalmente você executaria isso ao lado de uma instância de perfil SQL para encontrar um processo de bloqueio e olhar para o comando mais recente que spid emitido no profiler.

 16
Author: Neil Barnwell, 2009-03-29 12:54:34