系统版本化(时态)表中标识列与起始时间顺序不符问题咨询
问题解答
这种情况确实是事务并发重叠导致的,核心原因在于标识列值的生成时机和时态表系统时间列的记录时机不一致:
- 标识列(Identity)的值是在事务发起数据插入请求、申请标识值时就分配的,这个过程即时完成,和事务提交时间无关。
- 时态表的
StartTime(系统版本化起始时间)是在事务成功提交时,由SQL Server自动记录的当前系统时间。
对应你给出的示例,实际场景大概是这样:
- 事务A先启动,申请到标识值
1,但因锁等待、业务逻辑耗时等原因提交较晚,最终StartTime记录为2022-09-21 14:10:26.1524526 - 事务B稍晚启动,申请到标识值
2,但提交速度更快,StartTime被记录为更早的2022-09-21 14:10:25.4181267
两者提交后,历史表就会出现你看到的“起始时间更早但标识值更高”的记录。
如果需要让标识列和StartTime的顺序匹配,不能依赖标识列的天然顺序,而应该以StartTime作为排序依据;业务层面也可以通过事务控制减少并发导致的时间差,但通常没必要——时态表的核心价值是基于时间维度的历史追溯,标识列的顺序并不影响其核心功能。
内容的提问来源于stack exchange,提问作者SBFrancies
相关产品推荐
相关产品推荐

