Sql-Server

ALLOW_SNAPSHOT_ISOLATION 和 READ_COMMITTED_SNAPSHOT

  • July 27, 2021

大多數論壇和線上範例總是建議在有人詢問快照、行版本控製或類似問題時兩者都設置ALLOW_SNAPSHOT_ISOLATION並設置為 ON。READ_COMMITTED_SNAPSHOT

我猜這兩個設置中的 SNAPSHOT 這個詞都會有點混亂。我認為,為了讓數據庫引擎對 READ_COMMITTED 預設行為使用行版本控製而不是鎖定,無論設置如何,數據庫READ_COMMITTED_SNAPSHOT都設置為 ON 。ALLOW_SNAPSHOT_ISOLATION

ALLOW_SNAPSHOT_ISOLATION設置設置為 ON 僅允許在啟動事務時進行快照隔離(例如 SET TRANSACTION ISOLATION LEVEL SNAPSHOT),而不管READ_COMMITTED_SNAPSHOT設置如何。

將這兩個設置設置為 ON 的唯一原因是它需要具有 READ COMMITTED 行版本控制 快照隔離。

我的問題是,我的理解在某種程度上不正確嗎?並且這兩個設置必須始終一起設置為 ON(尤其是對於 READ COMMITTED 行版本控制)?

你的理解是正確的。它確實有點令人困惑。

Kim Tripp(SQL Server 的程序員之一,也是 SQLSkills 的組成部分)完全按照您在 Snapshot Isolation 的 MCM 影片中所說的內容進行了介紹。在影片中快進到 41:45 以到達她回答您問題的部分。

如果你使用ALLOW_SNAPSHOT_ISOLATION確保你SET TRANSACTION ISOLATION LEVEL SNAPSHOT在你的程式碼中使用,否則你將不會獲得任何好處。

如果設置SET READ_COMMITTED_SNAPSHOT ON,則無需修改任何程式碼。MS SQL Server 自動為該表應用快照隔離。

如果你在程式碼中要求不同的隔離級別,我還沒有測試過會發生什麼,我懷疑它會覆蓋這個選項,但先測試一下。

使用快照隔離快速查看性能成本。

關於快照隔離如何改變應用程序預期行為的好文章。它顯示了更新語句和選擇語句如何返回完全不同和意外結果的範例。

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