首页 > 其他分享 >分页查询在某些场景下引发的数据漏处理问题

分页查询在某些场景下引发的数据漏处理问题

时间:2023-11-29 12:05:49浏览次数:34  
标签:status 场景 分页 int 查询 userList bachSize

背景

问题描述

假设有一个表字段statues,我们分页获取数据。status初始状态为1,我们分批获取数据,每一批获取1000,对数据进行处理,如果处理成功就更新status为2,否则不更新。

注意事项:

分页循环查询满足条件的数据然后进行处理,通过PageHelper或者直接使用“limit statIndex,pageSize”来分页查看数据,如果查询条件(如根据status来过滤数据)在每一次获取之后会更改,这里的更改可能指的是在每次循环查询内部更改满足查询条件的数据,如status=1的条件,在查询完之后更改为status=2,注意这里的更改还有可能出现在另外的逻辑链条中。

又或者将status=1的记录删除,或者再增加新的status=1的记录,这些都是类似问题,都会导致分页的数量

原有代码

List<User> userList;
int startPage = NumberUtils.INTEGER_ONE;
int bachSize = 10;

do {

    PageHelper.startPage(startPage, bachSize);

    // 查询用户列表
    userList = userMapper.listNeedApproveUser(xxx);

    if (CollectionUtils.isNotEmpty(userList)) {

        for (User user : userList) {

            // 处理用户审核状态
            int updNum = userMapper.updateApproveStatus(yyy);

        }
    }

    startPage++;
} while (userList.size() == bachSize);

分页查询后的变更过程如下

分页查询在某些场景下引发的数据漏处理问题_数据

我们看到,原本在第二页的数据跑到第一页去了,而我们找第二页数据时,6、7两条数据就被丢弃了。
相信看图大家都应该看懂了,道理也很简单,但在做得时候却忽略了。

更新之后的代码

针对上面所说的分页查询方式,我们需要做一些调整,调整办法如下:

  • 第一步:当查询出当页的数据之后,记录下本次拉取的最后一条数据的排序字段值;当发起下一页数据查询的时候,带上这个参数,服务端通过这个参数做过滤条件
  • 第二步:排序字段值不能出现重复
List<User> userList;
int bachSize = 10;
Long idGreater = NumberUtils.LONG_ZERO;

do {

// 查询用户列表select * from user where approve_status = #{approveStatus} and id > ${idGreater} order by id asc limit ${pageSize}
userList = userMapper.listNeedApproveUser(xxx, idGreater, bachSize);

if (CollectionUtils.isEmpty(userList)) {
break;
}

// 将本次循环查询到的最大id作为下次执行的startIndex,id > #{startIndex}
idGreater = userList.get(userList.size() - 1).getId();

for (User user : userList) {

// 处理用户审核状态
int updNum = userMapper.updateApproveStatus(yyy);

}

} while (transferImeiDetailList.size() == MAX_BATCH_SIZE);

 

相关文章

https://zhuanlan.zhihu.com/p/617014259

  

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。



分页查询在某些场景下引发的数据漏处理问题_分页_02

作者:翎野君

标签:status,场景,分页,int,查询,userList,bachSize
From: https://blog.51cto.com/lingyejun/8613648

相关文章

  • RestClient查询文档
    前面我们已经实现利用DSL实现文档查询和后续结果处理,下面我们利用Java RestClient实现前面的功能一、快速入门1.1.基本案例演示我们通过match_all来演示下基本的APl,先看请求DSL的组织:查询所有的信息如下:@SpringBootTestpublicclassHotelSearchTests{//创建成员变量,保存......
  • Golang Gin 获取Restful参数、URL查询参数,Form 表单参数,JSON格式参数
    前言http请求中,可以通过URL查询参数提交数据到服务器,可以通过post的json方式,还有一直方式就是Form表单。Form表单相比URL查询参数,用户体验好,可以承载更多的数据,尤其是文件上传时,特别方便。这里推荐飞雪无情的博客;写了一些列的gin的使用教程,很时候新手学习如果想对gin有一个完整......
  • SpringBoot JPA实践之EntityManage查询返回自定义DTO entityManager.createNativeQuer
    SpringBootJPA实践之EntityManage查询返回自定义DTOentityManager.createNativeQuery(sql)  在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现,JPA提供的多数查询均以返回Entity居多,它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象(这与......
  • react native FlatList 下拉加载更多分页数据
    一.官方文档flatlist文档onendreached方法二、相关代码importReact,{useState,useEffect}from'react';import{View,FlatList,Text,ActivityIndicator}from'react-native';constMyFlatListWithLoadMore=()=>{const[data,setData]=u......
  • 移动CRM有哪些应用场景?
     最近杭州亚运会盛大举办,外国友人在打卡各地美食景点的同时也体会到了移动支付的乐趣。在智能手机全面普及的今天,移动CRM系统的应用也越来越广泛,移动CRM系统的应用场景有哪些?我们分享两个例子。场景A:李明是刚刚入职新公司的客户经理,今天的工作内容是拜访三家大客户,时间有限李......
  • Android Compose 的分页(Paging3)
    Overview官方链接:https://developer.android.com/topic/libraries/architecture/paging/v3-overview需要注意的是,Paging库的组件在应用程序的三层中运行,Paging在三层的架构如下图:存储库层ViewModel层用户界面层在三层的数据传递如下图:方法/接口官方链接:https://dev......
  • 位运算的实现及应用场景
    在.NET6中使用枚举类(enum)实现位运算是一个相对直接的过程。首先,你需要定义一个枚举类型,通常是使用[Flags]属性标记,这样可以更清楚地表明该枚举用于位运算。以下是如何进行这一操作的步骤:定义带有[Flags]属性的枚举:这个属性用于指示枚举值可以组合。枚举的每个成员应该是......
  • element-plus之form表单场景大全
    1.:validate-event="false"的作用是,当前这个表单change或者blur的时候不进行表单校验,只有提交按钮验证时候才校验标红框,场景运用:当切换其他tab也好,根据select1选的值,然后给select2赋值,结果没查到select2为空数组时候自动标红,类似这种不想要红的可以处理<el-select......
  • mysql语句查询最大值并获取
    publicintexadd(examexam)throwsException{Connectionconnection=DBUtil.dbCon();Stringsql="selectmax(eid)eidfromjuan";PreparedStatementpstmt=null;......
  • 20-基础SQL-多表查询
     多表关系项目开发过程中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为以下三种:1.一对多(多对一)2.多对多案例1:创建学生表(student),课程表(course),学生课程关系表(student_......