2016-06-28 75 views
1

有没有一种很好的方式来报告C#中的Microsoft SQL服务器死锁信息? 我有一个正在运行查询,更新等的C#程序...偶尔它会得到一个死锁错误,但错误消息在诊断问题时没有特别的帮助: 事务(进程ID 347)锁定资源与另一个进程并被选为死锁受害者。重新运行交易。C#死锁信息

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

+0

你可以尝试这样的事情http://stackoverflow.com/questions/13159326/implementing-retry-logic-for-deadlock-exceptions – NinjaDeveloper

+0

看它是否有助于你:http://stackoverflow.com /问题/ 320636 /如何对获得高效-SQL服务器死锁处理 - 在-C锋利与-ADO – Aby

回答

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