Activerecord 时间戳错误分配

Activrecord timestamp wrong assignment

对于以下内容:

         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 29513782951377 记录早 created_at (and updated_at)

任何人都知道这是怎么发生的,这个记录是由队列工作处理程序插入的。

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

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

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

看起来 Rails 计算时间戳,而不是依赖数据库来计算时间戳

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

所以当多个工作人员同时保存记录时会发生这种情况是有道理的。