一、
遇到一个生产问题,现象是一张表的ID字段和CREATE_TIME字段不匹配,排序时不一致。
比如按照ID降序,CREATE_TIME有交错。按照CREATE_TIME降序,ID有交错:
000199 10月27号
000198 10月26号
000197 10月25号
000196 10月26号
000195 10月24号
或者
000199 10月27号
000198 10月26号
000196 10月26号
000197 10月25号
000195 10月24号
二、
分析:ID是从sequence里取的,CREATE_TIME是应用程序取的系统时间
三、
假设1:时间有问题
如果时间有偏差,差几秒、几分钟是可以理解的,但是从现象上看,出现了26号-25号-26号这样的时间跳跃,时间只会往前加不会往回走
假设2:sequence有问题
sequence是数据库控制的,并且设置了缓存
四、
论证:询问dba,了解到数据库使用双主模式,所以两台机器都有sequence缓存,会造成这样的情况比如:A数据库缓存了100到200,B数据库缓存了200到300。插库的时候可能先从B数据库插入,再从A数据库插入
五、
解决:由于应用需要ID和CREATE_TIME保持一致增长,去掉了数据库中的sequence缓存
六、方法
分析-假设-论证-解决