【问题标题】:SQL Server IDENTITY(1,1) Column not generated in sync with UpdatedDateSQL Server IDENTITY(1,1) 列未与更新日期同步生成
【发布时间】:2018-07-13 21:02:55
【问题描述】:

我在基于 SQL Server 的应用程序中遇到了一个奇怪的情况,我试图弄清楚我在尝试解释它时遗漏了什么。

我在表上有一个触发器,每次更新/删除表中的记录时,触发器都会将日志插入到日志表中。 Bellow 是我最近发现的日志表的一个示例。

ID    UpdatedDate
------------------------------
10    2018-07-06 12:20:54.287
11    2018-07-06 12:20:54.657
12    2018-07-06 12:20:54.703
13    2018-07-06 12:20:54.910
14    2018-07-06 12:20:54.900
15    2018-07-06 12:20:54.953
16    2018-07-06 12:20:55.070
17    2018-07-06 12:20:55.087
18    2018-07-06 12:20:55.100
19    2018-07-06 12:20:55.113
20    2018-07-06 12:20:55.117
21    2018-07-06 12:20:55.143
22    2018-07-06 12:20:55.243
23    2018-07-06 12:20:53.973

如果您查看最后一条记录 #23,UpdateDate 小于 ID 较小的其他(较旧)记录的 UpdatedDate。这对我来说很奇怪,因为 ID 列是用 IDENTITY(1,1) 定义的,这意味着它是单调递增的。因此,ID 的值越高,记录越新,因此 UpdatedDate 列应始终增加,并且记录 #23 不应具有较旧的时间戳。

顺便说一句,在日志表中的插入只使用 GETDATE() 作为 UpdatedDate 列。

这可以用某种方式解释吗?

【问题讨论】:

  • 编辑您的问题并显示触发器的(相关)代码。

标签: sql sql-server database


【解决方案1】:

我很确定您正在测量两种不同的事物。 updatedDate 可能更像是在调用触发器时——甚至是在调用 update/delete 时。 id 是该行实际插入到表中的时间。

因此,您所看到的是较旧的更新/删除将在稍后进入日志。我推测这是因为这个过程需要更长的时间——常见的罪魁祸首是更多的行受到影响、页面拆分、索引更新、触发器。因为它需要更长的时间,所以较早的日期记录得比其他事务晚。

我认为,如果您在列中使用 default getdate(),您会看到更多的一致性。

【讨论】:

  • 所以你的意思是它可能是触发器上的竞争条件。最后一条记录 #23 需要更长的时间来处理,但由于它明确使用 GETDATE() 函数,因此日期已经被捕获。因此,如果其他触发器执行在它之前完成,则 ID 将增加,但日期是从触发器执行开始时捕获的日期。我认为这是有道理的...想知道在表定义上使用默认的 getdate() 是否只会提高一致性或保证一致性?
  • @DKhanaf 。 . .你其实总结的很好。我不太了解内部原理,无法知道在这种竞争条件下何时添加默认值。
猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多