Как мы можем проверить, какие блокировки базы данных применяются к каким строкам в пакете запроса?
Любой инструмент, который выделяет блокировку уровня строки таблицы в реальном времени?
БД: SQL Server 2005
источник
Как мы можем проверить, какие блокировки базы данных применяются к каким строкам в пакете запроса?
Любой инструмент, который выделяет блокировку уровня строки таблицы в реальном времени?
БД: SQL Server 2005
Чтобы добавить к другим ответам, sp_lock
также может использоваться для выгрузки полной блокировки информации на все запущенные процессы. Вывод может быть ошеломляющим, но если вы хотите точно знать, что заблокировано, его стоит запустить. Я обычно использую его, sp_who2
чтобы быстро сосредоточиться на проблемах блокировки.
В Интернете доступно несколько разных версий «более дружественных» sp_lock
процедур, в зависимости от рассматриваемой версии SQL Server.
В вашем случае, для SQL Server 2005, sp_lock
он по-прежнему доступен, но устарел, поэтому сейчас рекомендуется использовать sys.dm_tran_locks
представление для такого рода вещей. Вы можете найти пример того, как «свернуть свою собственную» функцию sp_lock здесь .
Это не совсем показывает, какие строки заблокированы, но это может помочь вам.
Вы можете проверить, какие операторы заблокированы, выполнив это:
select cmd,* from sys.sysprocesses
where blocked > 0
Он также скажет вам, что ждет каждый блок. Таким образом, вы можете проследить это до конца, чтобы увидеть, какой оператор вызвал первый блок, вызвавший другие блоки.
Изменить, чтобы добавить комментарий от @MikeBlandford :
Столбец заблокирован указывает скорость процесса блокировки. Вы можете запустить kill {spid}, чтобы исправить это.
Вы можете найти текущие блокировки на вашем столе , следуя запросу.
Смотрите 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 будет иметь разные значения.
источник
Я использую Dynamic Management View (DMV) для захвата блокировок, а также object_id или partition_id заблокированного элемента.
(ДОЛЖЕН переключиться на базу данных, которую вы хотите наблюдать, чтобы получить object_id)
источник
sp_who2
и внутриsys.dm_os_waiting_task
(оба пытаются обновить одну и ту же таблицу). Но ваше утверждение не возвращает никаких строк. Любые идеи?Вы также можете использовать встроенную
sp_who2
хранимую процедуру для получения текущих заблокированных и блокирующих процессов на экземпляре SQL Server. Обычно вы запускаете это вместе с экземпляром SQL Profiler, чтобы найти процесс блокировки и посмотреть на самую последнюю команду, выданную spid в профилировщике.источник
Вы можете найти подробности через скрипт ниже.
источник