sql w3schools Como verificar quais bloqueios são mantidos em uma tabela




w3schools titles (4)

Você pode encontrar os bloqueios atuais em sua tabela seguindo a consulta.

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');

Veja 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 Tabela 1; e a transação T1, que está sendo executado 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.

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

Qualquer ferramenta que realce o bloqueio de nível de linha da tabela em tempo real?

DB: SQL Server 2005


Você também pode usar o procedimento armazenado sp_who2 interno para obter processos bloqueados e bloqueando atuais em uma instância do SQL Server. Normalmente, você executaria isso junto a uma instância do SQL Profiler para localizar um processo de bloqueio e examinar o comando mais recente que o spid emitiu no profiler.


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)

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;

Para adicionar às outras respostas, sp_lock também pode ser usado para despejar informações de bloqueio completo em todos os processos em execução. A saída pode ser esmagadora, mas se você quiser saber exatamente o que está bloqueado, é valioso para executá-la. Eu costumo usá-lo junto com sp_who2 para rapidamente se sp_who2 em problemas de bloqueio.

Existem várias versões diferentes de procedimentos de sp_lock "mais amigáveis" disponíveis on-line, dependendo da versão do SQL Server em questão.

No seu caso, para o SQL Server 2005, sp_lock ainda está disponível, mas obsoleto, por isso agora é recomendado usar a visualização sys.dm_tran_locks para esse tipo de coisa. Você pode encontrar um exemplo de como "rolar sua própria" função sp_lock here .





sql-server-2005