mybatis limit 數據重複及遺漏

某天寫了一段CRUD,提測給QA,後來想起來忘記按規則排序了,而後修改了代碼提交,這個時候QA扔給我一條狗,不,是一個BUG。mybatis

心裏一片憂傷,CRUD也有BUG啊,怎麼辦怎麼辦,趕忙看看去。測試

BUG描述:分頁查詢出來的數據有重複和遺漏。這個地方用一個測試表來描述吧。spa

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條數據。3d

分頁查詢第一頁:code

 

分頁查詢第二頁:blog

 

 

結論:從圖上咱們能夠看到 id in(10,40)的數據出現了2次,id in(7,8)的數據沒有被查出來。數據確實出現了重複和遺漏。我以前對於mybatis的理解是它會默認按照ID進行排序的,產生了懷疑。排序

第一頁看起來是排序是亂的,其實並非,這個順序是我寫入數據的順序(10,2,3,40,5,63,7,8 故意把ID弄亂了)。第二頁看起來是按照id進行排序的。ci

也就是說兩次查詢感受用了不同的排序方式?其實不是的。真是狀況是,它用了堆排序。it

那麼不是默認按照ID排序的嗎?其實在非limit的狀況下,默認真的是按照ID排序的。不信,你看!class

 

那麼面對這種狀況要怎麼解決分頁查詢的遺漏和重複呢?--增長排序字段

 

但是你看,加了排序字段後仍是漏了一條 id in (3)的數據。這又是爲何呢?

咱們先看看這幾個數據有什麼問題呢,能夠看到這個排序字段對應的值都是同樣的。我懷疑它排序的時候,相同值的排列方式也是堆排序,沒有求證,哪位知道的小哥哥小姐姐求指正。

因此第二頁limit的時候這幾天記錄排序不同,可是從第6條開始取值,就漏掉了3,重複了10。

 

那麼這到底要怎麼辦?--仍是那句話增長排序字段!

增長一個ID字段進行排序,這樣就能夠把BUG關閉了,否則真的要改行了。

相關文章
相關標籤/搜索