Sql-Server

為什麼行版本控制隔離使用記錄版本的連結列表?

  • December 15, 2013

試圖更好地理解 SQL Server 中基於行版本控制的事務隔離…

根據 Kimberly L. Tripp,Neal Graves 的“ SQL Server 2005 Row Versioning-Based Transaction Isolation ”:

  • “…當修改表或索引中的記錄時,新記錄將被標記為正在執行修改的事務的“sequence_number””

這很有意義 - 當事務 ID 連結到記錄更改時。

我無法理解的是,來自同一來源:

  • “……特定記錄的所有早期版本都連結在一個連結列表中”

在此處輸入圖像描述

為什麼需要在鍊錶中,即連結同一記錄的更改?

更新:

正如Remus Resanu他對“快照隔離是否只給您已送出的內容?(以及一般快照隔離問題。)”的回答中所述:

  • “快照將為您提供在拍攝快照時送出的數據。這一時刻意味著如果您使用真正的 SNAPSHOT 隔離級別,則當您發出 BEGIN TRAN 時,或者如果您使用 read_committed_snapshot RCSI,則表示您的語句開始的那一刻”

換句話說,需要為多個/不同事務(具有相應的指針/連結)保留記錄的多個行版本,即在拍攝快照時直接訪問相應的副本(儘管每個多個交易,但單筆一一對應的交易)。這與RCSI 在 tempdb 中佔用較少空間但與陳述相矛盾(或使我的理解模棱兩可)的解釋完全一致,指的是 RCSI 和 SNAPSHOT(請注意,根據其在 RCSI 和 SNAPSHOT 之間沒有任何區別該文章中使用的上下文):

  • “特定記錄的所有早期版本都連結在一個連結列表中;對於長期執行的基於行版本控制的事務,必須在每次訪問時遍歷該連結以達到該行的事務一致版本。版本記錄必須保留在版本儲存中,只要存在可能對它們感興趣的基於行版本控制的查詢”

後者聽起來 RCSI 和 SNAPSHOT 所需的空間仍然相同?!

並且在不同的 MSDN 文章中聲明自相矛盾

子問題:

如果在單個事務中對同一記錄進行多次更新,則儲存了多少個版本?

為什麼需要鍊錶,即連結同一條記錄的變化?

索引或數據頁中的“目前行”僅提供指向版本儲存中*最新行版本的指針。*需要舊版本的事務需要一種方法來導航到它應該使用的確切版本。鍊錶提供了這種機制。

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