2011-09-20 80 views
1

我發現這個從http://sqlserverdb.blogspot.com/2011/06/find-all-system-and-user-defined-error.htmlSQL Server鎖罪魁禍首?

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 

從那裏我試圖推導出從w.blocking_session_id未來實際的SQL語句,但我似乎無法找到合適的位。任何人都可以指出我的線索嗎?

我在一個SSMS(SQL2008)查詢窗口使用:

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

而在另一個新的窗口,我執行這樣的:

select * from MyTable 

而且SSMS表明它在等待 '永遠' 執行查詢,所以它是塊受害者。但我想知道問題代碼實際上是誰。

謝謝。

回答

3

給你提供的示例查詢,下面的完整的示例展示了使用sys.dm_os_waiting_tasks DMV優先於sys.dm_tran_locks DMV阻斷SQL:

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

相關問題