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