C#死锁信息

时间:2016-06-28 12:22:08

标签: c# sql sql-server

有没有一种很好的方法来报告C#中的Microsoft SQL Server死锁信息? 我有一个运行查询,更新等的C#程序...偶尔会出现死锁错误,但错误消息在诊断问题时没有特别的帮助: 事务(进程ID 347)在锁资源上与另一个进程死锁,并被选为死锁牺牲品。重新运行该交易。

现在我必须跟踪一个DBA来搜索SQL日志以获取死锁图。我想知道是否有办法以编程方式获取此信息?

1 个答案:

答案 0 :(得分:0)

死锁的详细信息不会返回给客户端。在SQL Server的更高版本中,一种以编程方式获取死锁详细信息的方法是查询system_health扩展事件会话,如下面的示例查询,您可以根据具体情况进行调整。请注意,此方法需要VIEW SERVER STATE权限。

--get deadlock_report from ring_buffer target
SELECT
       xed.value('@timestamp', 'datetime') as Creation_Date,
       xed.query('.') AS Extend_Event
FROM
(
       SELECT CAST([target_data] AS XML) AS Target_Data
       FROM sys.dm_xe_session_targets AS xt
       INNER JOIN sys.dm_xe_sessions AS xs
       ON xs.address = xt.event_session_address
       WHERE xs.name = N'system_health'
       AND xt.target_name = N'ring_buffer'
) AS XML_Data
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed)
ORDER BY Creation_Date DESC;
GO