Я пытаюсь понять / научиться отслеживать детали заблокированного сеанса.
Поэтому я создал следующую настройку:
create table foo (id integer not null primary key, some_data varchar(20));
insert into foo values (1, 'foo');
commit;
Теперь я подключаюсь к базе данных дважды от двух разных клиентов.
Первая сессия вопросов:
begin transaction
update foo set some_data = 'update'
where id = 1;
Я явно не совершаю там, чтобы сохранить замки.
Во втором сеансе я делаю то же самое заявление и, конечно, то, что каждый ждет из-за блокировки. Теперь я пытаюсь использовать различные запросы, чтобы увидеть, что сессия 2 ожидает foo
таблицы.
sp_who2
показывает следующее (я удалил некоторые столбцы, чтобы показать только важную информацию):
СПИД | Статус | BlkBy | DBName | Команда | СПИД | RequestID ----- + -------------- + ------- + ---------- + ---------- -------- + ------ + ---------- 52 | спать | , | еда | ОЖИДАНИЕ КОМАНДЫ | 52 | 0 53 | спать | , | еда | ОЖИДАНИЕ КОМАНДЫ | 53 | 0 54 | ПОДВЕСНОЙ | 52 | еда | ОБНОВЛЕНИЕ | 54 | 0 56 | RUNNABLE | , | еда | ВЫБРАТЬ В | 56 | 0
Ожидается, что сеанс 54 заблокирован незафиксированными изменениями сеанса 52.
Запросы sys.dm_os_waiting_tasks
также показывают это. Заявление:
select session_id, wait_type, resource_address, resource_description
from sys.dm_os_waiting_tasks
where blocking_session_id is not null;
возвращает:
session_id | wait_type | адрес_ресурса | resource_description ----------- + ----------- + -------------------- + ----- -------------------------------------------------- -------------------------- 54 | LCK_M_X | 0x000000002a35cd40 | keylock hobtid = 72057594046054400 dbid = 6 id = режим lock4ed1dd780 = X ассоциированныйObjectId = 72057594046054400
Опять же это ожидается.
Моя проблема в том, что я не могу понять, как найти фактическое имя объекта, которого ожидает сессия 54.
Я нашел несколько запросов, которые присоединяются sys.dm_tran_locks
и sys.dm_os_waiting_tasks
вот так:
SELECT ....
FROM sys.dm_tran_locks AS l
JOIN sys.dm_os_waiting_tasks AS wt ON wt.resource_address = l.lock_owner_address
Но в моем приведенном выше тестовом сценарии это объединение ничего не возвращает. Так что либо это объединение неверно, либо на dm_tran_locks
самом деле не содержит информацию, которую я ищу.
Поэтому я ищу запрос, который возвращает что-то вроде:
« сеанс 54 ожидает блокировки в таблицеfoo
».
Некоторая справочная информация:
Реальная проблема, которую я пытаюсь решить, немного сложнее, но сводится к вопросу «на каком столе ожидает сессия 54». Проблема, о которой идет речь, включает в себя длинную хранимую процедуру, которая обновляет несколько таблиц, и выбор из представления, которое обращается к некоторым из этих таблиц. Оператор select
блокируется, даже если у нас есть изоляция моментального снимка и включенный моментальный снимок чтения. Выяснение, почему выбор заблокирован (что я думал, было бы невозможно, если включена изоляция моментального снимка) будет следующим шагом.
В качестве первого шага я хотел бы узнать, на то , что ожидает , что сессия.