2016-06-28 74 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