在更新时态表中的行时,该行的旧值存储在历史表中,事务开始时间为SysEndTime。当前表中的新值将使事务开始时间作为SysStartTime。
SysStartTime和SysEndTime是时态表使用的datetime2列,用于记录某一行为当前版本时的情况。事务开始时间是包含更新启动的事务的时间。
BOL说:
系统datetime2列中记录的时间基于事务本身的开始时间。例如,插入在单个事务中的所有行都将在与SYSTEM_TIME周期的开始对应的列中记录相同的UTC时间。
示例:我开始在20160707 11:00:00上更新我的Orders表中的所有行,事务需要5分钟才能运行。这将在历史记录表中为每一行创建一行,其SysEndTime为20160707 11:00:00。当前表中的所有行都有一个SysStartTime of 20160707 11:00:00。
如果有人在20160707 11:01:00上执行查询(当更新运行时),他们将看到旧值(假设默认读取提交隔离级别)。
但是,如果有人要使用AS OF语法查询时态表,就像在20160707 11:01:00一样,他们会看到新的值,因为他们的SysStartTime是20160707 11:00:00。
对我来说,这意味着它不能像当时那样显示那些行。如果它使用事务结束时间,那么问题就不会存在。
问题:这是故意的吗?我是不是遗漏了什么?
我认为它使用事务开始时间的唯一原因是它是事务启动时唯一的“已知”时间。它不知道事务何时开始结束,在结束时应用结束时间需要时间,这将使其应用的结束时间无效。这有道理吗?
这应该允许您重新创建该问题。
发布于 2016-10-21 20:59:32
在提交事务时,所有数据都必须写入数据页(内存中和日志文件中的磁盘中)。包括SysStartTime和SysEndTime列。在事务结束时间实际完成之前,如何知道它的结束时间?
除非您能够预测未来,否则使用事务启动时间是唯一的选择,即使它可能不那么直观。
https://dba.stackexchange.com/questions/143241
复制相似问题