码迷,mamicode.com
首页 > 其他好文 > 详细

mybatis limit 数据重复及遗漏

时间:2018-04-23 19:54:46      阅读:1027      评论:0      收藏:0      [点我收藏+]

标签:int   是的   自增   def   create   color   bsp   time   姐姐   

某天写了一段CRUD,提测给QA,后来想起来忘记按规则排序了,然后修改了代码提交,这个时候QA扔给我一条狗,不,是一个BUG。

内心一片忧伤,CRUD也有BUG啊,看来混不下去了该换行了,怎么办怎么办,赶紧看看去。

BUG描述:分页查询出来的数据有重复和遗漏。这个地方用一个测试表来描述吧。

CREATE TABLE `product_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 自增主键,
  `partner_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT 供应商ID,
  `poi_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT 门店ID,
  `product_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 商品ID,
  `quantity` decimal(18,6) NOT NULL DEFAULT 0.000000 COMMENT 数量,
  `created_time` datetime NOT NULL DEFAULT 1000-01-01 00:00:00 COMMENT 创建时间,
  `modify_time` datetime NOT NULL DEFAULT 1000-01-01 00:00:00 COMMENT 修改时间,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_partner_poi_product` (`partner_id`,`poi_id`,`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT=商品表

数据表product_info中共有8条数据。

技术分享图片

分页查询第一页:

技术分享图片

 

分页查询第二页:

 技术分享图片

 

结论:从图上我们可以看到 id in(10,40)的数据出现了2次,id in(7,8)的数据没有被查出来。数据确实出现了重复和遗漏。我之前对于mybatis的理解是它会默认按照ID进行排序的,产生了怀疑。

第一页看起来是排序是乱的,其实并不是,这个顺序是我写入数据的顺序。第二页看起来是按照id进行排序的。

也就是说两次查询感觉用了不一样的排序方式?其实不是的。真是情况是,它用了堆排序。

那么不是默认按照ID排序的吗?其实在非limit的情况下,默认真的是按照ID排序的。不信,你看!

技术分享图片

 

那么面对这种情况要怎么解决分页查询的遗漏和重复呢?--增加排序字段

技术分享图片

技术分享图片

 

可是你看,加了排序字段后还是漏了一条 id in (3)的数据。这又是为什么呢?

我们先看看这几个数据有什么问题呢,可以看到这个排序字段对应的值都是一样的。我怀疑它排序的时候,相同值的排列方式也是堆排序,没有求证,哪位知道的小哥哥小姐姐求指正。

所以第二页limit的时候这几天记录排序不一样,但是从第6条开始取值,就漏掉了3,重复了10。

技术分享图片

 

那么这到底要怎么办?--还是那句话增加排序字段!

增加一个ID字段进行排序,这样就可以把BUG关闭了,不然真的要改行了。

技术分享图片

技术分享图片

 

mybatis limit 数据重复及遗漏

标签:int   是的   自增   def   create   color   bsp   time   姐姐   

原文地址:https://www.cnblogs.com/selinamee/p/8920390.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!