我们有一个SQL Server数据库用于存储我们的交易数据。在每个表中,我们都有一个LastUpdatedOn
列,可以使用GETDATE()
函数进行填充。
我们看到的是,当我们对这些表进行批量更新操作时,在批量操作结束时,LastUpdatedOn
列中的时间戳将是过去的日期。
例如:如果更新操作在上午10:00:00.000 AM开始,GETDATE()
函数将选择该时间作为时间,LastUpdatedOn
列将填充日期时间为10:00: 00.000 AM如果脚本需要30秒才能执行,那么在脚本完成执行的10:00:30.000 AM时,lastupdateon
列将填充过去的日期。
请参阅下面的示例脚本:
SELECT TOP 100000 *
INTO #tmp
FROM dbo.Test
BEGIN TRAN
UPDATE L
SET l.lastupdateon = getdate()
FROM dbo.Test L
JOIN #tmp T ON T.entitykey = L.entitykey
COMMIT TRAN
我们遇到的问题是,我们有一个具有from和to日期的delta操作。此操作将返回在from和迄今之间更新的所有记录。在这种情况下,如果在上午10:00:15.000 AM调用增量操作,即使记录在上午10:00:00000更新,也不会提取作为脚本一部分更新的记录。这些记录永远不会被拉扯。
除了使事务可序列化之外,是否有解决此问题的方法?
此致
约翰
答案 0 :(得分:0)
根本问题在于更新需要时间,因此在您告诉SQL Server向表中写入值以及何时提交该值以及其他人可见时,总会存在延迟。
您需要在delta操作中解决此问题。只有一个进程写入表中?如果是这样,新提交的行将始终具有LastUpdatedOn值,该值在表中的所有其他值之后。在这种情况下,delta操作应该跟踪上次获得的最大LastUpdatedOn值并查找大于该值的任何值。