Sql-Server-2008

死鎖錯誤未返回死鎖 SQL

  • February 13, 2020

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 比跟踪標誌輸出更友好。

編輯

  1. @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列表中進行一些搜尋、替換和使用,如此處所述
  2. Wayne Sheffield在此處發布了一個有用的腳本,用於將死鎖圖 XML 分解為表格格式。

引用自:https://dba.stackexchange.com/questions/10644