在单个事务中,如果同一条记录有多次更新,会存储多少个版本?

根据金伯利·L·特里普(Kimberly L. Tripp)和尼尔·格雷夫斯(Neal Graves)在MSDN文章中的说法,SQL Server 2005基于行版本控制的事务隔离机制中,一个特定记录的所有早期版本都以链表的形式链接在一起。对于长时间运行的基于行版本控制的事务来说,在每次访问时都需要遍历这个链表,以达到事务一致性版本的行。 这段话出自“理解行版本控制”部分,该部分适用于“使用行版本控制的读提交”和“快照隔离中的行版本控制”两个小节。 接下来,通过多个事务(T1、T2、T3)对同一条记录进行多次更新的例子,进一步说明了行版本控制的情况,但仅限于快照隔离模式。 如果只有一个事务多次更新同一条记录(通过多个语句),那么会存储(链接)多个版本存储还是只存储在快照“图像”被创建时的那个版本呢? 好吧,对于这个问题的回答应该能立即回答我其他相关问题。
1个回答

在单个事务中,如果同一记录有多次更新,会存储多少个版本? 只有一个。 对行的第一次更新会生成一个行版本并独占锁定该行。在同一事务中对同一行进行后续更新不会生成新的行版本。
一个行版本的链表可能如下所示: - 事务 T1 在 SNAPSHOT 事务中读取一行,并看到值为 'a'。 - 事务 T2(在任何隔离级别下)将值从 'a' 更新为 'b' 并提交。这会为值 'a' 生成一个行版本。 - 事务 T3(在任何隔离级别下)将值从 'b' 更新为 'c' 并提交。这会为值 'b' 生成一个行版本。该行版本链接到先前版本 'a' 的行版本。 - 事务 T1 通过遍历链接从当前页面上存储的值('c')到行版本 'b',然后返回到行版本 'a' 来读取行值。 无论是否存在正在进行的读取事务(在任何隔离级别下),数据更改都会生成行版本。这些版本可能永远不会被使用,但它们仍然被生成 - 即使没有事务 T1,也会创建相同的版本链表。