Как мы можем проверить, какие блокировки базы данных применяются в каких строках к пакету запросов?
Любой инструмент, который подчеркивает блокировку уровня строки таблицы в реальном времени?
DB: SQL Server 2005
Как мы можем проверить, какие блокировки базы данных применяются в каких строках к пакету запросов?
Любой инструмент, который подчеркивает блокировку уровня строки таблицы в реальном времени?
DB: SQL Server 2005
Чтобы добавить к другим ответам, sp_lock
также можно использовать для сброса полной информации о блокировке для всех запущенных процессов. Выходной сигнал может быть подавляющим, но если вы хотите точно знать, что заблокировано, это будет полезно для запуска. Я обычно использую его вместе с sp_who2
для быстрого устранения проблем с блокировкой.
В зависимости от версии SQL Server существует несколько различных версий "более дружественных" sp_lock
процедур.
В вашем случае для SQL Server 2005 sp_lock
по-прежнему доступен, но устарел, поэтому теперь рекомендуется использовать sys.dm_tran_locks
вид для такого рода вещей. Вы можете найти пример того, как "сворачивать свою собственную" функцию sp_lock здесь.
Это точно не показывает, какие строки заблокированы, но это может вам помочь.
Вы можете проверить, какие из операторов заблокированы, выполнив это:
select cmd,* from sys.sysprocesses
where blocked > 0
Он также расскажет вам, что ждет каждый блок. Таким образом, вы можете проследить все это, чтобы увидеть, какой оператор вызвал первый блок, который вызвал другие блоки.
Изменить, чтобы добавить комментарий от @MikeBlandford:
Блокированный столбец указывает на спад процесса блокировки. Вы можете запустить kill {spid}, чтобы исправить это.
Я использую 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;
Вы также можете использовать встроенную хранимую процедуру sp_who2
, чтобы получить текущие блокированные и блокирующие процессы на экземпляре SQL Server. Как правило, вы запускаете это вместе с экземпляром SQL Profiler, чтобы найти процесс блокировки, и посмотрите на самую последнюю команду, которую spid выдал в профилировщике.
Вы можете найти текущие блокировки в своей таблице, выполнив следующий запрос.
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 будет иметь разные значения.