2010-03-31 148 views
1

我陷入了死鎖問題,在這裏我正在努力尋找根本原因......死鎖圖表顯示UPDATE語句成爲SELECT語句的受害者... 令我困惑的是該UPDATE語句正試圖收購上是從來沒有在更新語句中引用一些其他表的索引...SQL Server 2008死鎖問題

這是我的UPDATE語句看起來像......

UPDATE Table set col1 = @P1 where col2 = @P2 

這種說法獲得了X鎖定col2索引,但也嘗試獲取某個其他表中與U無關的列中定義的索引PDATE語句...

贏得死鎖情況的SELECT語句與update語句中的表或索引無關,但試圖在UPDATE語句中獲取表中的索引。最終導致DEADLOCK。

+2

你可能想檢查你的約束和依賴關係。也許被UPDATE鎖定的表有一個約束或觸發器,或者當你的UPDATE表被修改時修改它。 – tloflin 2010-03-31 22:30:04

回答

4

更新交易/鎖將包括喜歡的東西:

  • 觸發
  • 外鍵驗證(?在col1的FK)
  • 檢查約束(在col1使用UDF)
  • 索引視圖(使用table.col1或table.col2)

任何這些都可能導致明顯無關的表有鎖

0

除了其他優秀的答案之外,需要考慮的是select通常會獲取一個共享讀鎖,它允許一系列選擇在資源上維護一個共享鎖。更新聲明可能永遠沒有機會被授予排他鎖。通常,雖然引擎在防止這種飢餓方面做得很好,但是如果您正在使用另一個語句的事務中使用更新,那麼這可能會使問題複雜化。如果是這種情況,請提供交易中發生的更多細節。

+1

第一句話描述了一個「活鎖」http://www.thesqlteam.com/dasblogce/PermaLink,guid,504b355e-e3af-44b8-84d7-5d230c232d31.aspx或http://blog.sqlauthority.com/2008/03/21/sql-server-introduction-live-lock-what-is-live-lock/ – gbn 2010-03-31 22:40:48

+0

+1 Nice鏈接。有些情況下這些檢測機制會失敗,並且您必須添加鎖定提示。比如包含一個select然後是一個更新的事務(共享鎖試圖被ugpraded爲exclusive),這樣你需要添加一個查詢提示來使select語句從開始獲得排它鎖。 – AaronLS 2010-03-31 23:03:20