Как проверить, какие блокировки хранятся на столе

Как мы можем проверить, какие блокировки базы данных применяются в каких строках к пакету запросов?

Любой инструмент, который подчеркивает блокировку уровня строки таблицы в реальном времени?

DB: SQL Server 2005

Ответ 1

Чтобы добавить к другим ответам, sp_lock также можно использовать для сброса полной информации о блокировке для всех запущенных процессов. Выходной сигнал может быть подавляющим, но если вы хотите точно знать, что заблокировано, это будет полезно для запуска. Я обычно использую его вместе с sp_who2 для быстрого устранения проблем с блокировкой.

В зависимости от версии SQL Server существует несколько различных версий "более дружественных" sp_lock процедур.

В вашем случае для SQL Server 2005 sp_lock по-прежнему доступен, но устарел, поэтому теперь рекомендуется использовать sys.dm_tran_locks вид для такого рода вещей. Вы можете найти пример того, как "сворачивать свою собственную" функцию sp_lock здесь.

Ответ 2

Это точно не показывает, какие строки заблокированы, но это может вам помочь.

Вы можете проверить, какие из операторов заблокированы, выполнив это:

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

Он также расскажет вам, что ждет каждый блок. Таким образом, вы можете проследить все это, чтобы увидеть, какой оператор вызвал первый блок, который вызвал другие блоки.

Изменить, чтобы добавить комментарий от @MikeBlandford:

Блокированный столбец указывает на спад процесса блокировки. Вы можете запустить kill {spid}, чтобы исправить это.

Ответ 3

Я использую Dynamic Management View (DMV) для захвата блокировок, а также object_id или partition_id элемента, который заблокирован.

(ДОЛЖЕН перейти к базе данных, которую вы хотите наблюдать, чтобы получить 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;

Ответ 4

Вы также можете использовать встроенную хранимую процедуру sp_who2, чтобы получить текущие блокированные и блокирующие процессы на экземпляре SQL Server. Как правило, вы запускаете это вместе с экземпляром SQL Profiler, чтобы найти процесс блокировки, и посмотрите на самую последнюю команду, которую spid выдал в профилировщике.

Ответ 5

Вы можете найти текущие блокировки в своей таблице, выполнив следующий запрос.

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

Смотрите sys.dm_tran_locks

Если существует несколько экземпляров одного и того же request_owner_type, столбец request_owner_id используется для различения каждого экземпляра. Для распределенных транзакций столбцы request_owner_type и request_owner_guid отображают информацию о разных сущностях.

Например, Session S1 имеет общую блокировку в таблице 1; и транзакция T1, которая работает под сеансом S1, также имеет общую блокировку в таблице 1. В этом случае столбец resource_description, который возвращается sys.dm_tran_locks, отобразит два экземпляра одного и того же ресурса. В столбце request_owner_type будет показан один экземпляр как сеанс, а другой - как транзакция. Кроме того, столбец resource_owner_id будет иметь разные значения.