2012-11-13 21 views
1

的: Deadlock under ReadCommited IL ,並得到一個答案:如何擺脫我在這裏所描述的問題僵局

So a deadlock can occur when running SELECTs because the transaction running 
those selects had acquired write locks before running the SELECT. 

好了,我能做些什麼來擺脫這種?有一些常見的死鎖類型可以通過添加覆蓋索引或改變sql命令文本的隔離級別,使用表提示等來解決,但我無法爲我的情況想出適當的解決方案。

好像這是死鎖的最常見和最簡單的原因:

  1. 過程上種源R1,過程獲取資源鎖A獲得的鎖R2
  2. 過程等待資源R2被釋放,並且過程等待R1

因此,這在很大程度上是一種並行的問題,而且,很可能,業務邏輯也。

也許我能夠避免死鎖,如果鎖應用於行,但似乎有一個頁面內有多個rowlocks,然後鎖定升級發生,然後我整個頁面鎖定。

什麼,你會建議?禁用鎖定升級?我可以在本地進行1筆交易嗎? 或者也許應用一些表提示(WITH ROWLOCK)或其他... idk

現在不能將隔離級別更改爲快照(或其他類型)。 謝謝。

+0

「更改隔離級別爲快照(或其他類型)是不是一種選擇,現在」 - 你能解釋一下爲什麼? –

+0

死鎖是常規數據庫操作的一部分。大多數情況下,當發生死鎖時,SQL Server錯誤實際上會告訴您_retry_死鎖受害者。這就是你應該做的。 – Oded

+0

@MitchWheat,我不知道爲什麼,但我不能在沒有適當調查的情況下更改系統中的默認IL。我研究了快照IL和RCS,據我所知,這些可能導致數據庫中的數據不正確或不一致(儘管是 - 我會擺脫死鎖) –

回答

1

固定死鎖主要是特定於所考慮的特定交易的任務。幾乎沒有一般的建議可以給出(除了啓用快照隔離,你不能這麼做)。

一種模式出現作爲標準修復,但:獲得所有必要的鎖與右鎖定模式的正確順序。這可能意味着選擇WITH (UPDLOCK, ROWLOCK, HOLDLOCK)以主動鎖定行。

我還沒有看到鎖升級成爲問題,因爲它需要非常大量的鎖來踢。當然,這可能是原因,但多數情況下,行鎖都足以引發僵局。