如果在单个事务中对同一记录进行多次更新,将存储多少个版本?

Ful*_*oof 12 sql-server transaction tempdb-version-store snapshot-isolation

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

  • “...特定记录的所有早期版本都链接在一个链表中;并且在基于行版本控制的长时间运行的事务的情况下,必须在每次访问时遍历该链接以到达事务一致的版本行”

这在“了解行版本控制”部分中是常见的“使用行版本控制读取提交中的行版本控制”和“快照隔离中的行版本控制”部分。

进一步关于由于修改导致的行版本控制的示例仅在 SNAPSHOT 中的多个事务(T1、T2、T3)对同一记录的多次更新的上下文中给出。

如果只有一个事务多次更新记录(通过多个语句),是存储(链接)多个版本存储还是仅在拍摄快照“图像”时拍摄的一个?

好吧,这个问题的答案应该立即回答我其他未决的相关问题:

Pau*_*ite 11

如果在单个事务中对同一记录进行多次更新,则存储多少个版本?

只有一个。

对该行的第一次更新会生成一个行版本并独占锁定该行。以后对同一事务中同一行的更新不会生成新的行版本。


行版本的链表可能出现如下:

  • SNAPSHOT 事务中的事务 T1 读取一行并看到值“a”。

  • 事务 T2(在任何隔离级别下)将值从“a”更新为“b”并提交。这将为值“a”生成一个行版本。

  • 事务 T3(在任何隔离级别下)将值从“b”更新为“c”并提交。这将为值“b”生成一个行版本。此行版本链接到“a”的前一行版本。

  • 事务 T1 通过遍历从存储在当前页 ('c') 上的值到行版本 'b' 的链接,然后返回行版本 'a' 来读取行值。

无论是否存在读取事务(在任何隔离级别),数据更改都会生成行版本。可能永远不需要这些版本,但它们仍然会生成——即使没有事务 T1,也会创建相同的版本链表。