Sql-Server
為什麼行版本控制隔離使用記錄版本的連結列表?
試圖更好地理解 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 所需的空間仍然相同?!
子問題:
為什麼需要鍊錶,即連結同一條記錄的變化?
索引或數據頁中的“目前行”僅提供指向版本儲存中*最新行版本的指針。*需要舊版本的事務需要一種方法來導航到它應該使用的確切版本。鍊錶提供了這種機制。