2014-09-01 130 views
0

使用C#我寫了一個Windows服務和單獨的Windows應用程序SQL死鎖異常

由於某些原因我不斷收到下面的錯誤。

現在這個錯誤發生很長一段時間了。

"SQL Exception During CustomSQL Execute: Transaction (Process ID 119) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. "

我知道其他服務也訪問數據庫中的同一個表。他們已經很長時間了,也就是幾個月,從未見過這個錯誤。

如何解決錯誤以準確查找導致此錯誤的原因?

謝謝

+0

你的其他語句之一有一個懸而未決的事務,他們忘了提交/回滾? – 2014-09-01 10:29:07

+0

設置一個記錄死鎖的數據庫分析器 - 然後您可以看到哪些進程發生衝突並以這種方式調試回代碼 – 2014-09-01 10:31:34

+0

請確保如果多個proc/statement訪問相同的表,並且它們在相同的順序。另外,如果您不太擔心數據在另一個語句中被更改,則可以在聯接中使用「with nolock」。正如艾倫所說,我知道捕捉它的唯一方法是使用輪廓儀,但如果它不經常發生,它可能無法捕捉它! – Lukos 2014-09-01 10:33:21

回答

0

有很多方法來解決死鎖問題。通常我通過運行此查詢開始:

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'; 

然後您可以使用結果查看死鎖的原因。

+0

錯誤:無效的對象名稱'sys.dm_xe_session_targets'。 – CaughtInALoop 2014-09-01 11:06:37

+0

@CaughtInALoop什麼版本的sql server?這應該在SQL Server 2008 R2和更新的工作。 – 2014-09-01 11:14:02

+0

ahh其版本2005在SQL Server 2008中出錯:無效的對象名'sys.dm_xe_session_targets'。 – CaughtInALoop 2014-09-01 11:55:47

0

這裏有您可能需要檢查,以減少死鎖的機會,幾件事情:

  1. 最小化的交易和交易倍。
  2. 每次在應用程序中總是以相同的順序訪問服務器對象。
  3. 避免遊標,while循環或進程在運行時需要用戶輸入 。
  4. 減少應用程序中的鎖定時間。
  5. 如果可能,使用查詢提示來防止鎖定(NoLock,RowLock)
  6. 使用SET DEADLOCK_PRIORITY選擇死鎖犧牲品。