mybatis分頁數據重復


今天測試的時候遇到個bug:分頁查詢出來的數據是亂序的(第一頁查過的數據也會跑第二頁去)

將mybatis 日志中的sql ,拿出來單獨執行,發現結果是正確,為什么mybatis查出來的數據是亂序的?

初步分析可能是排序列上的重復值引起的,但是我的sql中並沒有排序字段。

經過嘗試有兩種解決辦法:

1、在sql后面加上order by 主鍵,分頁查詢正確。

2、這個不算解決辦法,數據庫表中的主鍵被搞掉了,把主鍵加上分頁正確

網上查詢資料發現這么一句話:

oracle是按塊進行讀取數據的,如果數據按順序存儲,則可能使讀取出來的數據是按順序的,給用戶誤解為默認排序。事實上,oracle沒有進行任何排序操作,如果sql沒有要求排序,oracle會順序的從數據塊中讀取符合條件的數據返回到客戶端。所以在沒有使用排序sql的時候,分頁返回的數據可能是按順序的,也可能是雜亂無章的,這都取決與數據的存儲位置。在oracle分頁查詢過程中,如果數據的物理位置發生了改變,就可能會引起分頁數據重復的現象。

對於不同的oracle版本,處理這種情況的機制是不一樣的。在9中會根據rowid排序,但是在10.2種引入了一種類似堆排序的方法處理這種情況。之所以order by 后加索引能解決,是因為即使有重復值,也可以根據索引進行區分。

但是,在有排序條件的時候,仍然會出現數據重復的現象,這是為什么呢? 
通過了解oracle的排序機理就會明白,出現這種情況的原因是因為排序列值的不唯一性。 Oracle這里使用的排序算法不具有穩定性,
也就是說,對於鍵值相等的數據,這種算法完成排序后,不保證這些鍵值相等的數據保持排序前的順序。

解決的方法是在后邊增加一個唯一性列,比如主鍵。
所以解決方法如下(兩個條件必須同時滿足): 
 1.sql語句中需要有排序條件。 
 2.排序條件如果沒有唯一性,那么必須在后邊跟上一個唯一性的條件,比如主鍵。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM