业务场景
业务希望拉取的时候,严格按照创建时间进行排序。
创建的时候,db设置了一个默认创建时间的字段:
`created_at` timestamp default CURRENT_TIMESTAMP not null comment '创建时间'
在qa测试的时候,发现有些创建出来的实体并没有严格按照创建时间排序
原因
在排序和查询的时候,默认按照自增id来进行排序了,但是实际处理下来,发现自增id和创建时间的顺序有时候会不一致
底层逻辑
在 MySQL 中,自增主键和创建时间的顺序不是严格一致的。虽然在大多数情况下,自增主键的值是按照插入的顺序递增的,并且创建时间也是按照插入的时间顺序来赋值的,但是在一些特殊情况下,这种顺序可能会被打乱。
例如,在使用主从复制的数据库集群中,当多个写入操作同时进入主节点并且按照不同的顺序进行执行时,由于主从复制的延迟和同步机制,从节点接收到的数据可能会出现顺序上的偏差,导致自增主键和创建时间的顺序不一致。
此外,在并发插入数据的情况下,也可能会出现自增主键和创建时间的顺序不一致的情况。比如有两个线程同时插入数据,一个线程先插入了一条数据并且获取了自增主键值,但是由于某些原因,写入到数据库的时间比另一个线程晚,导致第二个线程插入的数据的创建时间早于第一个线程插入的数据的创建时间,这样就会打乱自增主键和创建时间的顺序。
因此,在实际使用中,如果需要保证自增主键和创建时间的顺序严格一致,可以在插入数据时使用 MySQL 提供的事务机制来保证插入的顺序,或者在应用程序中通过单线程插入数据来避免并发导致的顺序问题。