我在基于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
列。
这可以解释吗?
我敢肯定你在测量两种不同的东西。updatedDate
可能更像是在调用触发器时,甚至是在调用update
/delete
时。id
是指该行实际插入到表中的时间。
因此,您看到的是,较旧的更新/删除会在以后的时间进入日志。我推测这是因为这个过程需要更长的时间——常见的罪魁祸首是更多的行受到影响、页面分割、索引更新和触发器。因为它需要更长的时间,所以较旧的日期会比其他事务记录得晚。
我认为,如果您使用default getdate()
作为列,您会看到更多的一致性。