以下内容:
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插入。
答案 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
因此,当多个工作人员同时保存记录时,就会发生这种情况。