是否可以使用特定事務的 ReadCommitted 隔離級別覆蓋 ReadCommittedSnapshot 隔離級別?
我的數據庫的預設隔離級別是“讀取送出快照”。請看下面的截圖。
我的數據庫中有包含以下數據的“Tickets”表。
現在在連接 1 中,我正在啟動一個隔離級別為“已送出”的新事務。我要將#TicketID“2”的優先級更新為“中”
從連接 2,我試圖訪問 #TicketID “2” 的詳細資訊。並且它仍然從由讀取送出的快照隔離創建的版本儲存中獲取值,這不是預期的行為。
根據文件,如果事務使用“已送出”隔離級別,則在事務執行送出/回滾之前,任何其他事務都無法訪問該行。
誰能告訴我為什麼在給定的情況下它沒有發生?我也很想知道,為什麼事務級別的隔離不能覆蓋在數據庫級別設置的預設隔離級別(這裡是讀取送出的快照)?
為了更清楚地說明事務範圍的隔離覆蓋,我提供了以下資訊。
我已將我的數據庫隔離設置為已送出讀。
現在在連接 1 中,我正在啟動我的交易以更新門票優先級。
在連接 2 中,我正在嘗試訪問記錄。但這不會完成,因為事務隔離級別處於“讀取送出”模式。
在連接 3 中,我試圖訪問隔離級別為“未送出讀取”的記錄。在這裡我們可以看到記錄,因為它將覆蓋在數據庫級別設置的預設隔離。
當我在數據庫級別設置“快照隔離”並在另一個事務範圍中覆蓋它時,我期待相同的行為。對我來說,它總是從版本儲存返回最後送出的值,而不管在事務範圍中提到的隔離級別。我希望我清楚地表達了我的擔憂.. :)
無法覆蓋整個事務的已送出讀快照 (RCSI) 的數據庫級設置。
當設置 RCSI 時,所有讀取送出的事務將使用行版本,提供行的最後送出版本。
已要求提供會話級覆蓋選項。您可以在Add
SET TRANSACTION ISOLATION LEVEL READ COMMITTED LOCK
的產品回饋網站上為它投票。您可以使用表提示覆蓋每個語句和每個表的設置。
READCOMMITTEDLOCK
或者,您可以使用快照隔離 (SI) 並關閉已送出的讀取快照隔離 (RCSI)。然後每筆交易要麼
SET TRANSACTION ISOLATION SNAPSHOT
要麼SET TRANSACTION ISOLATION LEVEL READ COMMITTED
。有關隔離級別的系列文章中的更多資訊。