是否有一种好的方法可以在c#中报告Microsoft SQL server死锁信息?我有一个c#程序,可以运行查询、更新等…偶尔会出现死锁错误,但错误消息对诊断问题没有特别的帮助:
事务(进程ID 347)在锁资源上死锁另一个进程和已被选为死锁受害者。重新运行事务。
现在我必须找到一个DBA去搜索SQL日志来获得死锁图。我想知道是否有一种方法来获得这些信息程序化?
死锁的详细信息不返回给客户端。在更高版本的SQL Server中,以编程方式获取死锁详细信息的一种方法是查询system_health Extended Event会话,如下面的示例查询,您可以根据具体情况进行调整。注意,此方法需要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