Activrecord时间戳错误分配

时间:2016-08-29 15:08:06

标签: ruby-on-rails-3 activerecord

以下内容:

         updated_at         |         created_at         |   id    
----------------------------+----------------------------+---------
 2016-08-26 12:33:35.900201 | 2016-08-25 12:33:13.782502 | 2951380
 2016-08-26 12:33:35.916025 | 2016-08-25 12:33:13.781838 | 2951379
 2016-08-25 12:33:13.684854 | 2016-08-25 12:33:13.684854 | 2951377
 2016-08-25 12:33:13.684753 | 2016-08-25 12:33:13.684753 | 2951378
 2016-08-25 12:33:13.652293 | 2016-08-25 12:33:13.652293 | 2951376
 2016-08-26 12:32:59.669535 | 2016-08-25 12:33:13.589147 | 2951375
 2016-08-26 12:32:59.680676 | 2016-08-25 12:33:13.556841 | 2951374
 2016-08-26 12:32:59.559429 | 2016-08-25 12:33:13.496964 | 2951373
 2016-08-26 12:32:59.573863 | 2016-08-25 12:33:13.461594 | 2951372
 2016-08-26 12:31:10.338129 | 2016-08-25 12:33:13.400724 | 2951371

ID 2951378的{​​{1}}早于created_at (and updated_at)记录!

任何人都知道如何发生这种情况,这些记录由Queue worker handler插入。

2 个答案:

答案 0 :(得分:1)

想象一下同时发生的几个交易。它们都需要自动生成的ID。但是数据库不能为每个事务保留相同的ID,因为如果它们都成功,它们将在提交时相互覆盖。

因此,每个事务都有自己的一组自动递增值。事务A可能在事务B之前开始,并且已经分配了一些ID,但是B首先完成,并且较大的ID会在较早的时间内保存。

这不是任何错误的迹象。提醒您,您永远不应该假设自动生成的ID的顺序与数据库中的事件序列相关。

答案 1 :(得分:0)

看起来Rails会计算时间戳,而不是依靠数据库来执行此操作

https://github.com/rails/rails/blob/55dfa009769962367c58563480c9f776ae0f53ea/activerecord/lib/active_record/timestamp.rb#L120

因此,当多个工作人员同时保存记录时,就会发生这种情况。