zoukankan      html  css  js  c++  java
  • 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.排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键。

  • 相关阅读:
    夺命雷公狗---javascript NO:11 事件对象1
    夺命雷公狗---javascript NO:10 解决事件监听兼容性问题和移除事件
    夺命雷公狗---javascript NO:09 事件绑定的种类1
    夺命雷公狗---javascript NO:08 常用的事件
    夺命雷公狗---javascript NO:07 事件编程介绍
    夺命雷公狗---javascript NO:06 数组定义和遍历
    夺命雷公狗---javascript NO:05 js函数中的作用域
    夺命雷公狗---javascript NO:04 js中的函数
    夺命雷公狗---javascript NO:03 流程结构
    夺命雷公狗---javascript NO:02 数据类型和运算符
  • 原文地址:https://www.cnblogs.com/magic101/p/10064947.html
Copyright © 2011-2022 走看看