sql - tag - w3schools titles




Como verificar quais bloqueios são mantidos em uma tabela (4)

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


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;

Isso não indica exatamente quais linhas estão bloqueadas, mas isso pode ser útil para você.

Você pode verificar quais declarações estão bloqueadas, executando isto:

select cmd,* from sys.sysprocesses
where blocked > 0

Também lhe dirá o que cada bloco está esperando. Assim, você pode rastrear todo o caminho para ver qual instrução causou o primeiro bloco que causou os outros blocos.

Editar para adicionar comentário de @MikeBlandford :

A coluna bloqueada indica o spid do processo de bloqueio. Você pode executar kill {spid} para consertá-lo.


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.


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