Sql-Server

為什麼啟用讀取已送出快照時共享鎖會阻塞在 IX 鎖上?

  • October 30, 2020

我們的系統在以前沒有的區域隨機開始死鎖,並且對死鎖圖的分析看起來甚至不應該發生。這是死鎖圖的螢幕截圖。

在此處輸入圖像描述

供參考:左節點是對錶的基本插入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 鎖:

在已送出讀快照隔離 (RCSI) 下獲取的共享鎖

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