Como verificar quais fechaduras são mantidas em uma mesa
DB: SQL Server 2005
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 .
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.
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;
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');
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.
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.