开发者

解决MyBatisPlus的updateBatchById()批量修改失效问题

目录
  • MyBATisPlus的updateBatchById()批量修改失效
    • 1、问题描述
    • 2、初步判断
    • 3、修改尝试
  • MyBatisPlus使用updateBatchById小记
    • 过程
  • 总结

    MyBatisPlus的updateBatchById()批量修改失效

    1、问题描述

    一个实现类page分页查询方法,一进入实现类page方法先获取所有的表数据,再设置符合条件的数据状态为1,使用集合收集,再使用updateBatchById()方法批量修改,接着继续分页查询,按入参条件查询相关数据返回,结果批量修改方法未生效。

    2、初步判断

    日志显示有:

    c.c.h.b.c.m.BaseMetaObjectHandler :start update fill .... ==> Parameters: 1(String)

    判断:

    事务问题,使用updateBatchById()会有事务。不知道为什么事务没有提交。

    3、修改尝试

    使用循环update()单个数据。结果修改生效了!

    MyBatisPlus使用updateBatchByIphpd小记

     
    //    @Transactional(rollbac编程客栈kFor = Exception.class)
        public Boolean test() {
            List<StaffInfo> staffInfos = this.list();
            staffInfos = staffInfos.stream().map(staffInfo -> {
                if(staffInfo.getNumber().equals("0132791")) {  //如果number=0132791,则把元素设置成null,制造exception
                    staffInfo = null;
                    return staffInfo;
                }else{
                    staffInfo.setEntryTime(0L);
                    return staffInfo;
                }
            }).collect(Collectors.toList());
          return   this.updateBatchById(staffInfos);
    //        staffInfos.forEach(staffInhttp://www.devze.comfo -> {
    //            this.updateById(staffInfo);
    //        });
    //        return true;
        }

    过程

    staff_i编程客栈nfo表里,我通过sql把entry_time字段先设置成2,然后再通过代码设置成0,设置成2的时候一共有483条数据,然后通过代码修改的时候,

    我把number=0132791的数据设置成null,即更新这一条数据肯定会报错,通过debug我知道number=2这条数据在更新的list中处于index=141的位置,

    所以在number=0132791之后待更新的数据还有483-141=342条数据,如果是通过代码更新前

    解决MyBatisPlus的updateBatchById()批量修改失效问题

    • 第一种情况:不加@Transactional注解,使用updateById,一条一条数据更新

    如下图:很明显,在报错位置之后的记录里都没有被更新,报错位置之前的都编程客栈被更新了【报错之前已经提交了事务】 ,报错之后程序不再运行,故后边数据没更新

    解决MyBatisPlus的updateBatchById()批量修改失效问题

    • 第二种情况:加@Transactional注解,使用updateById,一条一条数据更新

    都没有被更新,因为加了事务之后,是在调用事务的方法上执行完成之后,才会提交事务,最终因为报错,方法没有执行完,所以事务没有被提交

    解决MyBatisPlus的updateBatchById()批量修改失效问题

    • 第三种情况:不加@Transactional注解,使用updateBatchById,批量更新

    都没有被更新,因为批量更新是开启了一个事务,然后统一提交,最后没提交成功

    • 第四种情况:加@Transactional注解,使用updateBatchById,批量更新

    和情况3相同,都没有被更新,全部回滚

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜