Sql-Server

是否可以使用特定事務的 ReadCommitted 隔離級別覆蓋 ReadCommittedSnapshot 隔離級別?

  • February 13, 2019

我的數據庫的預設隔離級別是“讀取送出快照”。請看下面的截圖。

讀取送出的快照

我的數據庫中有包含以下數據的“Tickets”表。

在此處輸入圖像描述

現在在連接 1 中,我正在啟動一個隔離級別為“已送出”的新事務。我要將#TicketID“2”的優先級更新為“

在此處輸入圖像描述

從連接 2,我試圖訪問 #TicketID “2” 的詳細資訊。並且它仍然從由讀取送出的快照隔離創建的版本儲存中獲取值,這不是預期的行為。

在此處輸入圖像描述

根據文件,如果事務使用“已送出”隔離級別,則在事務執行送出/回滾之前,任何其他事務都無法訪問該行。

誰能告訴我為什麼在給定的情況下它沒有發生?我也很想知道,為什麼事務級別的隔離不能覆蓋在數據庫級別設置的預設隔離級別(這裡是讀取送出的快照)?


為了更清楚地說明事務範圍的隔離覆蓋,我提供了以下資訊。

我已將我的數據庫隔離設置為已送出讀。

在此處輸入圖像描述

現在在連接 1 中,我正在啟動我的交易以更新門票優先級。

在此處輸入圖像描述

在連接 2 中,我正在嘗試訪問記錄。但這不會完成,因為事務隔離級別處於“讀取送出”模式。

在此處輸入圖像描述

在連接 3 中,我試圖訪問隔離級別為“未送出讀取”的記錄。在這裡我們可以看到記錄,因為它將覆蓋在數據庫級別設置的預設隔離。

在此處輸入圖像描述

當我在數據庫級別設置“快照隔離”並在另一個事務範圍中覆蓋它時,我期待相同的行為。對我來說,它總是從版本儲存返回最後送出的值,而不管在事務範圍中提到的隔離級別。我希望我清楚地表達了我的擔憂.. :)

無法覆蓋整個事務的已送出讀快照 (RCSI) 的數據庫級設置。

當設置 RCSI 時,所有讀取送出的事務將使用行版本,提供行的最後送出版本。

已要求提供會話級覆蓋選項。您可以在AddSET TRANSACTION ISOLATION LEVEL READ COMMITTED LOCK的產品回饋網站上為它投票。

您可以使用表提示覆蓋每個語句每個表的設置。READCOMMITTEDLOCK

或者,您可以使用快照隔離 (SI) 並關閉已送出的讀取快照隔離 (RCSI)。然後每筆交易要麼SET TRANSACTION ISOLATION SNAPSHOT要麼SET TRANSACTION ISOLATION LEVEL READ COMMITTED

有關隔離級別的系列文章中的更多資訊。

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