2011-09-20 39 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

相关问题