Как проверить, какие замки удерживаются на столе - PullRequest
138 голосов
/ 29 марта 2009

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

Какой-нибудь инструмент, который выделяет блокировку уровня строки таблицы в реальном времени?

БД: SQL Server 2005

Ответы [ 5 ]

110 голосов
/ 29 марта 2009

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

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

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

101 голосов
/ 29 марта 2009

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

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

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

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

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

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

38 голосов
/ 04 августа 2016

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

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 владеет общей блокировкой на Table1; и транзакция T1, которая выполняется в сеансе S1, также владеет общей блокировкой на Table1. В этом случае в столбце resource_description , возвращаемом sys.dm_tran_locks , будут показаны два экземпляра одного и того же ресурса. В столбце request_owner_type один экземпляр будет показан как сеанс, а другой - как транзакция. Кроме того, столбец resource_owner_id будет иметь другие значения.

35 голосов
/ 11 июня 2009

Я использую 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;
17 голосов
/ 29 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...