Sql-Server
為什麼啟用讀取已送出快照時共享鎖會阻塞在 IX 鎖上?
我們的系統在以前沒有的區域隨機開始死鎖,並且對死鎖圖的分析看起來甚至不應該發生。這是死鎖圖的螢幕截圖。
供參考:左節點是對錶的基本插入
sync_entities
,其中右節點是:update sync_entities set A=B, C=D from sync_entities e join sync_revisions r on e.id=r.entity_id where r.id in (<some very large list of IDs>)
根據我對鎖兼容性的理解,只有在Read Committed Snapshot關閉的情況下,當IX鎖存在時請求S鎖才會阻塞,但是對於這個數據庫它是打開的,並且已經很長時間了。我錯過了什麼嗎?
死鎖 XML 表示兩個程序都在使用isolationlevel=“read committed (2)"。
Read Committed Snapshot 不會影響鎖兼容性矩陣。
對於讀取,這意味著不獲取共享鎖,而讀取將使用行版本控制。假設您使用的是已送出讀,也就是說,這是唯一一個由已送出讀快照數據庫旋鈕“重新配置”的隔離級別。
根據https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-上的日誌兼容性矩陣,您顯然擁有共享鎖,並且會被 IX 鎖阻塞/阻塞r2/ms186396(v=sql.105)?redirectedfrom=MSDN。
所以你要調查的問題是為什麼你有共享鎖。也許您的應用程序的某些部分不使用已送出讀?
Paul 在另一個執行緒中提到,當您在 RCSI 中修改數據時,S 鎖用於 FK 驗證,這可以解釋為 S 鎖: