如何在SQL Server中查看死锁事务?

时间:2015-07-23 06:49:13

标签: sql sql-server

在我们的生产服务器中,经常发生死锁。是否有人可以帮助查看发生死锁的事务?

2 个答案:

答案 0 :(得分:2)

使用此查询

SELECT db.name                  DBName,
       tl.request_session_id,
       wt.blocking_session_id,
       Object_name(p.OBJECT_ID) BlockedObjectName,
       tl.resource_type,
       h1.TEXT                  AS RequestingText,
       h2.TEXT                  AS BlockingTest,
       tl.request_mode
FROM   sys.dm_tran_locks AS tl
       INNER JOIN sys.databases db
               ON db.database_id = tl.resource_database_id
       INNER JOIN sys.dm_os_waiting_tasks AS wt
               ON tl.lock_owner_address = wt.resource_address
       INNER JOIN sys.partitions AS p
               ON p.hobt_id = tl.resource_associated_entity_id
       INNER JOIN sys.dm_exec_connections ec1
               ON ec1.session_id = tl.request_session_id
       INNER JOIN sys.dm_exec_connections ec2
               ON ec2.session_id = wt.blocking_session_id
       CROSS APPLY sys.Dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1
       CROSS APPLY sys.Dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2 

来源:http://blog.sqlauthority.com/2010/10/06/sql-server-quickest-way-to-identify-blocking-query-and-resolution-dirty-solution/

答案 1 :(得分:0)

我可以使用以下三种方法:

获取活动死锁:

SELECT
    SESSION_ID
    ,BLOCKING_SESSION_ID
FROM SYS.DM_EXEC_REQUESTS
WHERE BLOCKING_SESSION_ID != 0

获取查询文本(并检查它是否真的很重要):

exec sp_whoisactive |session_id|

杀死僵局(明智地使用):

kill |session_id|

此外,先前的答案也无法正常运行(我不知道为什么),我已经执行了以下命令:

查询1:

begin tran
create table ##a (i int)
insert ##a values (1)

查询2:

delete ##a

查询3:答案