问题描述
由于XX记录是通过批量任务进行处理的,同一时间可能会处理多笔数据,也就是说多条数据的创建时间字段是相同的,此时通过接口查询,由于查询条件是通过创建时间排序的,创建时间一致时,在不同线程里查询到的记录是不一致的,翻页查询时会出现不同页码数据发生重叠的情况,针对这种情况需要按照自增主键排序的条件。
原因分析
生产环境进行分页查询时,每次分页查询都是从新的数据库连接进行查询,所以每次查询都会产生不一样的结果
测试环境模拟时,需要模拟在每次查询后都要断开连接后再次查询
代码中使用了union all关键字进行并集查询,查询了热表和历史表,union all会在查询后生成一个临时表,在临时表处理时只进行了creatTime的排序操作,且这些数据的creatTime都一致,在未对其他字段进行排序的情况下,每次重新建立连接分页查询后可能会出现结果顺序不一致的情况,数据无法准确区分这些记录的先后顺序,从而导致在查询后的结果中可能包含重复记录。
解决办法
主键作为唯一标识符,可以在排序时将其作为排序条件之一,确保结果集中不会包含重复记录,每次查询后的记录都是按照固定顺序排列的。
总结
在接口设计时,需要注意接口幂等性,相同的查询条件在每次查询出的结果包括顺序在内都应该一致。