SQL Server Lock Culprit Query? - PullRequest
       6

SQL Server Lock Culprit Query?

2 голосов
/ 20 сентября 2011

Я нашел это из http://sqlserverdb.blogspot.com/2011/06/find-all-system-and-user-defined-error.html:

SELECT
    t.resource_type,
    t.resource_database_id,
    t.resource_associated_entity_id,
    t.request_mode,
    t.request_session_id,
    w.blocking_session_id
    FROM sys.dm_tran_locks as t
    INNER JOIN sys.dm_os_waiting_tasks AS w
    ON t.lock_owner_address =w.resource_address

И оттуда я пытаюсь получить фактический оператор SQL, который приходит из w.blocking_session_id, но я не могу найти правильные биты.Кто-нибудь может указать мне на подсказку?

Я использую это в одном окне запроса SSMS (SQL2008):

begin transaction
update MyTable with (tablockx)
set MyTableColumn = MyTableColumn
where 1 = 0

И в другом новом окне я выполнил это:

select * from MyTable

И SSMS показывает, что он ожидает «навсегда» для выполнения запроса, поэтому он является жертвой блока.Но я хочу выяснить, кто на самом деле код проблемы.

Спасибо.

1 Ответ

6 голосов
/ 20 сентября 2011

Учитывая примеры запросов, которые вы представили, следующий полный пример показывает блокирующий SQL с использованием sys.dm_os_waiting_tasks DMV вместо sys.dm_tran_locks DMV:

SELECT DISTINCT
  TheBlockingSQL.text AS [The blocking SQL]
FROM sys.dm_exec_connections AS Conns
  INNER JOIN sys.dm_exec_requests AS BlockedReqs
ON Conns.session_id = BlockedReqs.blocking_session_id
  INNER JOIN sys.dm_os_waiting_tasks AS w
ON BlockedReqs.session_id = w.session_id
  CROSS APPLY sys.dm_exec_sql_text(Conns.most_recent_sql_handle) AS TheBlockingSQL

Вот снимок экрана с выводом:

enter image description here

...