外鍵會導致死鎖並阻礙 READ COMMITTED SNAPSHOT 嗎?
這是來自以下問題的後續問題:https ://stackoverflow.com/questions/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically
雖然
READ_COMMITTED_SNAPSHOT ON
.所以我有兩個問題:
注意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
.