的: 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命令文本的隔離級別,使用表提示等來解決,但我無法爲我的情況想出適當的解決方案。
好像這是死鎖的最常見和最簡單的原因:
- 過程上種源R1,過程乙獲取資源鎖A獲得的鎖R2
- 過程甲等待資源R2被釋放,並且過程乙等待R1
因此,這在很大程度上是一種並行的問題,而且,很可能,業務邏輯也。
也許我能夠避免死鎖,如果鎖應用於行,但似乎有一個頁面內有多個rowlocks,然後鎖定升級發生,然後我整個頁面鎖定。
什麼,你會建議?禁用鎖定升級?我可以在本地進行1筆交易嗎? 或者也許應用一些表提示(WITH ROWLOCK)或其他... idk
現在不能將隔離級別更改爲快照(或其他類型)。 謝謝。
「更改隔離級別爲快照(或其他類型)是不是一種選擇,現在」 - 你能解釋一下爲什麼? –
死鎖是常規數據庫操作的一部分。大多數情況下,當發生死鎖時,SQL Server錯誤實際上會告訴您_retry_死鎖受害者。這就是你應該做的。 – Oded
@MitchWheat,我不知道爲什麼,但我不能在沒有適當調查的情況下更改系統中的默認IL。我研究了快照IL和RCS,據我所知,這些可能導致數據庫中的數據不正確或不一致(儘管是 - 我會擺脫死鎖) –