Sql-Server

外鍵會導致死鎖並阻礙 READ COMMITTED SNAPSHOT 嗎?

  • May 8, 2020

這是來自以下問題的後續問題:https ://stackoverflow.com/questions/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically

雖然READ_COMMITTED_SNAPSHOT ON.

所以我有兩個問題:

  1. 我如何檢查事務隔離級別快照是否按預期/完全工作?
  2. 我假設外鍵(在 Web 應用程序到報告表的表中)負責死鎖。我發現了這篇有趣的文章

注意SQL Server 在驗證外鍵時會獲取共享鎖,即使事務正在使用讀取送出快照(使用行版本控制讀取送出)或快照隔離級別。在使用這些事務隔離級別時檢查來自事務的死鎖圖時要注意這一點。如果您看到共享鎖,請檢查是否在外鍵引用的對像上獲取了鎖。

我如何檢查 FK 是否真的對死鎖/超時情況負責,這是否意味著我可以刪除那些外鍵以防止死鎖(什麼是可以接受的努力)?

注意:我只從導致死鎖的表中讀取。

非常感謝有關此主題的任何想法。


編輯 這是一個 Deadlock-Graph。也許有人可以幫助我了解導致僵局的原因。當兩個事務想要寫入同一個表(一個更新和一個插入,插入作為儲存過程)時,似乎沒有任何報告執行僅由 Web 應用程序引起。為什麼它需要頁鎖以及如何只啟用行鎖?Insert-SP 已經使用TRANSACTION ISOLATION LEVEL REPEATABLE READ.

我強烈懷疑兩個觸發器(一個更新和一個插入)是造成死鎖的原因。這是插入觸發器:

CREATE TRIGGER [dbo].[CreateRMAFiDates] 
  ON  [dbo].[RMA] 
  AFTER INSERT
AS 
BEGIN
   SET NOCOUNT ON;

   UPDATE RMA 
   SET [fiCreationDate]=(SELECT idDate FROM tdefDate 
       WHERE CONVERT(VARCHAR, INSERTED.Creation_Date, 112) = tdefDate.Text),
       [fiPopDate]=(SELECT idDate FROM tdefDate 
       WHERE CONVERT(VARCHAR, INSERTED.POP_Date, 112) = tdefDate.Text),
       [fiManufactureDate]=(SELECT idDate FROM tdefDate 
       WHERE CONVERT(VARCHAR, INSERTED.Manufacture_Date, 112) = tdefDate.Text)
   FROM INSERTED;
END

所以這個觸發器更新了 RMA 表是什麼導致更新觸發器觸發(什麼類似)。死鎖圖是否證實了我的假設?我想我會刪除這些觸發器並創建一個每天執行一次的 SP,這已經足夠了,因為這些列僅適用於 SSAS-Cube(Molap)。

編輯:順便說一句,自從我刪除了這些觸發器以來,沒有死鎖了:)

如果 SQLCAT 團隊說 FK驗證是使用讀送出隔離完成的,那麼他們必須知道他們在說什麼。強調驗證。真正的問題是為什麼報告會觸發 FK 驗證?驗證發生在寫入,報告應該是讀取。要麼您的報告導致寫入,在這種情況下,快照隔離級別將無濟於事,要麼死鎖的原因不同。

取得進展的唯一方法是擷取死鎖圖。

至於另一個問題,如何檢查是否在快照隔離下操作:查看sys.dm_tran_active_snapshot_database_transactions.

引用自:https://dba.stackexchange.com/questions/6905