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