Sql-Server-2008
死鎖錯誤未返回死鎖 SQL
Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
當我的一個網站繁忙時,我會隨機收到此錯誤。我大致知道它發生在哪組表上,但根據我使用其他程序的經驗,我通常會在發生死鎖的地方返回 SQL。我應該打開一個標誌來允許這種情況發生嗎?
我將嘗試將死鎖本身作為一個單獨的問題進行調試,因為這是我現在的主要問題。
我正在使用 SQL Server 2008 標準版。
您需要的數據記錄在預設的擴展事件跟踪中。
DECLARE @xml XML SELECT @xml = target_data FROM sys.dm_xe_session_targets JOIN sys.dm_xe_sessions ON event_session_address = address WHERE name = 'system_health' AND target_name = 'ring_buffer' SELECT XEventData.XEvent.query('(data/value/deadlock)[1]') AS DeadlockGraph, CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) AS DeadlockGraph, XEventData.XEvent.value('(./@timestamp)[1]', 'DATETIME2') AS [DateTime] FROM (SELECT @xml AS TargetData) AS Data CROSS APPLY TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent) ORDER BY [DateTime] DESC
儘管如果您重新啟動了服務,它將不再存在 - 例如應用跟踪標誌或緩衝區在此期間已循環。
您可以設置自己的擴展事件跟踪,將死鎖圖儲存到文件目標以進行持久非易失性儲存。範常式式碼在這裡。我個人發現死鎖圖 XML 比跟踪標誌輸出更友好。
編輯
- @MartinC在評論中指出,在沒有所有更新的 SQL Server 實例上,生成無效 XML 可能存在問題。
CAST(REPLACE(REPLACE(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraph
解決方法是在SELECT
列表中進行一些搜尋、替換和使用,如此處所述。- Wayne Sheffield在此處發布了一個有用的腳本,用於將死鎖圖 XML 分解為表格格式。