使用SQL Server 2008 R2當同一個更新語句(使用不同參數)併發運行時,我遇到死鎖。這裏是死鎖圖形(抱歉無法張貼在這裏的圖像還):使用簡單更新語句SQl服務器死鎖
http://i.stack.imgur.com/E6JBK.png
這裏是實際的執行計劃:
http://i.stack.imgur.com/emm9i.png
更新是這樣的:
exec sp_executesql N'UPDATE mapping.IssuerAlternateName
SET
UseCount = UseCount + 1,
MostRecentlyAppeared = GETDATE(),
MostRecentlyAppearedUnderlyingAssetName = @p1
WHERE ID = @p0
',N'@p0 int,@p1 nvarchar(4000)',@p0=1234,@p1=N'blah blah blah'
如果我已經正確理解了事情,我們正在嘗試從相同索引讀取和寫入(PK_IssuerAlternateName_1)
。
有什麼辦法可以解決這個問題嗎?我想知道,如果向主鍵添加附加索引並使用WITH INDEX可能會通過停止讀取PK_IssuerAlternateName_1
(抱歉在執行計劃屏幕截圖中截斷全名)來解決該問題。
或者是最好的選擇只是爲了生活並重試交易,這是當前在.NET客戶端處理錯誤的方式。重試肯定是成功的,但如果可能的話,避免死鎖是一件好事。
感謝
你目前是否在交易中包裝這個?如果是這樣,你使用的隔離級別是什麼? – mallocation 2014-10-17 01:03:09
使用LINQ2SQL調用context.ExecuteCommand()... – MT1 2014-10-17 05:57:07