由一个排序的bug引发的思考-Tidb的自增主键非全局单调

BUG的发现

我们系统中有个重算日志的页面,页面主要字段大致有三个:
重算的开始日期、重算的结束日期、重算的状态。
页面上是按照重算开始日期倒序排列的,很符合常理,因为正常情况下,人们总是希望看到最近的记录。

但是该功能做过一次迭代后端数据库从mysql变成tidb了,然后看到重算日志页面的更新的日期没有排在最上面,追查后得知,该功能实现原理其实不是按照重算开始日期倒序排列的,而是用的id倒序排列。正常情况下,日期越新(离现在越近),id会越大,id是递增的。但是这种情况tidb不适用,对于tidb来说自增主键不是全局单调递增的。

原理

tidb是分布式的数据库,为了降低分布式分配自增id的网络开销,每个tidb节点会缓存一段不重复的id段,只有当预分配的id段使用完毕,或者tidb重启的时候才会重新申请新的id端。
举个例子,节点1预分配的id段为1000-3000,节点2预分配的id段为3000-6000,这时候插入一条数据a,通过节点2插入,这条数据的id在3000-6000范围内,然后随后又插入一条数据b,通过节点1插入,这条数据的id在1000-3000范围内,于是就出现了数据b时间更新,但是id更小的情况。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容