Sql-Server

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

  • December 15, 2013

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

  • “……特定記錄的所有早期版本都連結在一個連結列表中;對於長期執行的基於行版本控制的事務,必須在每次訪問時遍歷該連結以達到事務一致的版本行”

這是在“了解行版本控制”部分中常見的,用於遵循“使用行版本控制送出的讀取中的行版本控制”和“快照隔離中的行版本控制”部分。

進一步關於由於修改導致的行版本控制的範例僅在 SNAPSHOT 中由多個事務(T1、T2、T3)對同一記錄進行多次更新的上下文中給出。

如果只有一個事務多次更新一條記錄(通過多個語句),將儲存(連結)多個版本儲存還是僅在拍攝 SNAPSHOT“圖像”時拍攝的一個?

好吧,這個問題的答案應該立即回答我的其他懸而​​未決的相關問題:

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

只有一個。

對行的第一次更新會生成一個行版本並以獨占方式鎖定該行。以後對同一事務中同一行的更新不會生成新的行版本。


行版本的連結列表可能如下所示:

  • SNAPSHOT 事務中的事務 T1 讀取一行並看到值“a”。
  • 事務 T2(在任何隔離級別下)將值從“a”更新為“b”並送出。這會為值“a”生成一個行版本。
  • 事務 T3(在任何隔離級別下)將值從“b”更新為“c”並送出。這會為值“b”生成一個行版本。此行版本連結到“a”的前一行版本。
  • 事務 T1 通過遍歷從目前頁面 (‘c’) 上儲存的值到行版本 ‘b’ 的連結,然後返回到行版本 ‘a’ 來讀取行值。

行版本是由數據更改生成的,無論是否存在現有的讀取事務(在任何隔離級別)。這些版本可能永遠不需要,但它們仍然會生成——即使沒有事務 T1,也會創建相同的版本連結列表。

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