有很多方法來解決死鎖問題。通常我通過運行此查詢開始:
Declare @xml xml
Select @xml = CAST(target_data AS XML)
FROM sys.dm_xe_session_targets st
Inner Join sys.dm_xe_sessions s ON s.address = st.event_session_address
WHERE [name] = 'system_health'
Select
XEventData.XEvent.value('@package', 'nvarchar(max)') Package,
XEventData.XEvent.value('@name', 'varchar(max)') Name,
XEventData.XEvent.value('@timestamp', 'DateTime') Date,
XEventData.XEvent.query('(data/value)[1]') Deadlock,
cast(XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)') as xml),
XEvent.query('.') --*
From @xml.nodes('//RingBufferTarget/event') as XEventData (XEvent)
WHERE XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report';
然後您可以使用結果查看死鎖的原因。
你的其他語句之一有一個懸而未決的事務,他們忘了提交/回滾? – 2014-09-01 10:29:07
設置一個記錄死鎖的數據庫分析器 - 然後您可以看到哪些進程發生衝突並以這種方式調試回代碼 – 2014-09-01 10:31:34
請確保如果多個proc/statement訪問相同的表,並且它們在相同的順序。另外,如果您不太擔心數據在另一個語句中被更改,則可以在聯接中使用「with nolock」。正如艾倫所說,我知道捕捉它的唯一方法是使用輪廓儀,但如果它不經常發生,它可能無法捕捉它! – Lukos 2014-09-01 10:33:21