我们遇到了一个非常奇怪的问题,当打电话时GETUTCDATE()
第二个语句中的返回值比第一个语句稍早。我们的场景如下:
我们插入一个表来跟踪用户当前状态,该表有一个触发器,可以将用户过去状态的关联历史表插入到DATETIME
字段和插入调用GETUTCDATE()
完成此操作后,我们将拥有另一个带有关联记录的表,我们将其插入到调用中GETUTCDATE()
它跟踪哪个部分更新了用户状态。
所以流程是:
- 插入
UserStatuses
- 触发器触发
UserStatuses
表插入到UserStatusesHistory
呼叫GETUTCDATE()
- 然后我们插入
OwningStatuses
叫桌GETUTCDATE()
我们发现,在某些情况下DATETIME
on the UserStatusesHistory
是在之后DATETIME
on the OwningStatuses
table.
当GETUTCDATE()
on the OwningStatuses
在之后调用GETUTCDATE()
为了UserStatusesHistory
table?
在某些情况下触发器是异步运行的吗? (我无法相信这一点,因为它违背了我读过的所有内容,而且我们没有使用任何服务经纪人)。
是否有可能GETUTCDATE()
在某些情况下会在过程开始时缓存,并且此缓存值不会带入触发器中?
由于 SQL 的声明性性质,数据库引擎might可以自由地按照它认为合适的任何顺序评估 SQL 语句的各个部分(只要不影响语义)。您的建议是GETUTCDATE()
可能会被缓存,这是一种合理的情况。
我知道这不能回答你的问题。但无论 SQL2012 中 GETUTCDATE 的实现如何,它很可能在未来版本中发生变化。因此,请避免依赖它,否则未来的升级可能会变得非常痛苦。以不依赖于任何有关评估顺序的假设的方式实现您的逻辑。
根据您的具体情况,我看到了一些可能的解决方案。
- 如果你没有问题
OwningStatuses
稍微有一点时间later than UserStatusesHistory
,那么如果将第三步作为单独的批处理发送到 SQL Server,可能会有所帮助。
- 交换步骤2和3;并让触发查询
OwningStatuses
而不是自己编造日期。
- 停止使用触发器;考虑这一点的理由不止一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)