在我们的生产服务器中,经常发生死锁。是否有人可以帮助查看发生死锁的事务?
答案 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
答案 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:答案