【问题标题】:How does SNAPSHOT isolation read snapshot data for tempdb?SNAPSHOT 隔离如何读取 tempdb 的快照数据?
【发布时间】:2019-12-27 04:55:11
【问题描述】:
我试图了解 SNAPSHOT 隔离如何将数据拉入 tempdb。我知道由于 tempdb 中的行版本控制而存在事务一致性,但我更好奇首先如何将这些数据复制到 tempdb 中。
documentation 更多地讨论了如何从快照中读取数据,但并未真正涉及如何拍摄快照。在我看来,快照将以序列化方式完成,因为这将是数据库在特定时间的最准确表示。但是,我知道不要假设。
有谁知道这到底是怎么工作的?
【问题讨论】:
标签:
sql
sql-server
isolation-level
snapshot-isolation
【解决方案1】:
数据库中的每个更改都与一个“事务序列号”(XSN) 相关联。
每个快照或 RCSI 查询“从”某个 XSN 开始运行。
每个修改的行都标有其最后修改的 XSN。
因此,在查询读取一行之前,它会根据查询的 XSN 检查该行的 XSN。如果在查询开始后该行已被修改,则查询会在版本存储中查找该行的正确版本。
6 字节 XSN 是添加到行版本控制隔离级别中已修改行的 14 字节开销的一部分。它并非出现在所有行上,而是在修改行时添加(或为带有触发器的表插入)。此外,作为 Azure SQL 数据库和 SQL Server 2019 中 Accelerated Database Recovery 功能的一部分,版本存储已从 TempDb 移出并移入用户数据库。