徵狀
請試想下列案例:
-
您的資料庫有 ALLOW_SNAPSHOT_ISOLATION ,且 READ_COMMITTED_SNAPSHOT 在 Microsoft SQL Server 2008 R2 中啟用的選項。
-
針對資料庫中的資料表,您可以執行包含TABLOCK與UPDLOCK提示的SELECT語句。
-
SELECT語句會包裝在明確的開始事務中,但不會執行COMMIT 事務。
-
使用相同的查詢提示所啟動的兩個相同查詢,會出現在明確的事務中。
在這種情況下,當第一份查詢提交時,其中一個查詢會成為鎖死。
原因
出現這個問題是因為 SQL Server 在下列其中一種情況下會錯誤地報告鎖死:
-
針對資料庫啟用 ALLOW_SNAPSHOT_ISOLATION 和 READ_COMMITTED_SNAPSHOT時,如果其中一個專案完成時,可能會以不正確的方式報告多個針對相同事務的查詢。
-
啟用 ALLOW_SNAPSHOT_ISOTION 且使用提示 TABLOCK 與 UPDLOCK 時,第二個和第三個 SELECT 語句會採用 IX 鎖,目的是轉換為 X。當您嘗試轉換成 X 時,IX 鎖會 deadlocking [結束]。
-
當 ALLOW_SNAPSHOT_ISOLATION停用時,第二個和第三個查詢將會取得六個鎖。 在這種情況下,當六個鎖轉換為 X 時,只是封鎖案例,不是鎖死。
解決方案
此問題最初是在 SQL Server 的後續累積更新中修正。 套用熱修復程式後,如果資料庫和查詢已遇到讀取認可 提示或 NOLOCK 提示,則 SQL Server 會透過錄製來解決問題。 此資訊可用來選取正確的鎖類型,以正確處理狀況,而不是錯誤地報告鎖死。
SQL Server 2008 R2 SP2 累積更新11 /en-us/help/2926028
每個新的 SQL Server 累計更新都包含所有的修正程式,以及前一個累積更新中所包含的所有安全性修正程式。 查看 SQL Server 的最新累計更新:
狀態
Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。