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


11

根据Kimberly L. Tripp的MSDN文章,Neal Graves的“ 基于SQL Server 2005行版本控制的事务隔离

  • “ ... 特定记录的所有早期版本都链接在一个链表中;对于基于行版本控制的长期交易,每次访问都必须遍历该链接,以达到交易的一致版本行”

这在“了解行版本控制”部分中是通用的,可同时遵循“使用行版本控制提交的读取中的行版本控制”和“快照隔离中的行版本控制”部分。

此外,在仅通过SNAPSHOT中的多个事务(T1,T2,T3)对同一记录进行多次更新的情况下,给出了由于修改导致的行版本控制的示例。

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

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

Answers:


11

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

只有一个。

对行的第一次更新将生成行版本,并排他地锁定该行。以后对同一事务中同一行的更新不会生成新的行版本。


行版本的链接列表可能如下所示:

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

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

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

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

行版本由数据更改生成,而不管是否存在现有的读取事务(处于任何隔离级别)。可能永远不需要版本,但是仍会生成它们-即使没有事务T1,也会创建相同的版本链接列表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.