欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決MyBatisPlus的updateBatchById()批量修改失效問(wèn)題

 更新時(shí)間:2024年08月19日 14:28:52   作者:左小福  
這篇文章主要介紹了解決MyBatisPlus的updateBatchById()批量修改失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

MyBatisPlus的updateBatchById()批量修改失效

1、問(wèn)題描述

一個(gè)實(shí)現(xiàn)類(lèi)page分頁(yè)查詢(xún)方法,一進(jìn)入實(shí)現(xiàn)類(lèi)page方法先獲取所有的表數(shù)據(jù),再設(shè)置符合條件的數(shù)據(jù)狀態(tài)為1,使用集合收集,再使用updateBatchById()方法批量修改,接著繼續(xù)分頁(yè)查詢(xún),按入?yún)l件查詢(xún)相關(guān)數(shù)據(jù)返回,結(jié)果批量修改方法未生效。

2、初步判斷

日志顯示有:

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

判斷:

事務(wù)問(wèn)題,使用updateBatchById()會(huì)有事務(wù)。不知道為什么事務(wù)沒(méi)有提交。

3、修改嘗試

使用循環(huán)update()單個(gè)數(shù)據(jù)。結(jié)果修改生效了!

MyBatisPlus使用updateBatchById小記

 
//    @Transactional(rollbackFor = Exception.class)
    public Boolean test() {
        List<StaffInfo> staffInfos = this.list();
        staffInfos = staffInfos.stream().map(staffInfo -> {
            if(staffInfo.getNumber().equals("0132791")) {  //如果number=0132791,則把元素設(shè)置成null,制造exception
                staffInfo = null;
                return staffInfo;
            }else{
                staffInfo.setEntryTime(0L);
                return staffInfo;
            }
        }).collect(Collectors.toList());
      return   this.updateBatchById(staffInfos);
//        staffInfos.forEach(staffInfo -> {
//            this.updateById(staffInfo);
//        });
//        return true;
    }

過(guò)程

staff_info表里,我通過(guò)sql把entry_time字段先設(shè)置成2,然后再通過(guò)代碼設(shè)置成0,設(shè)置成2的時(shí)候一共有483條數(shù)據(jù),然后通過(guò)代碼修改的時(shí)候,

我把number=0132791的數(shù)據(jù)設(shè)置成null,即更新這一條數(shù)據(jù)肯定會(huì)報(bào)錯(cuò),通過(guò)debug我知道number=2這條數(shù)據(jù)在更新的list中處于index=141的位置,

所以在number=0132791之后待更新的數(shù)據(jù)還有483-141=342條數(shù)據(jù),如果是通過(guò)代碼更新前

  • 第一種情況:不加@Transactional注解,使用updateById,一條一條數(shù)據(jù)更新

如下圖:很明顯,在報(bào)錯(cuò)位置之后的記錄里都沒(méi)有被更新,報(bào)錯(cuò)位置之前的都被更新了【報(bào)錯(cuò)之前已經(jīng)提交了事務(wù)】 ,報(bào)錯(cuò)之后程序不再運(yùn)行,故后邊數(shù)據(jù)沒(méi)更新

  • 第二種情況:加@Transactional注解,使用updateById,一條一條數(shù)據(jù)更新

都沒(méi)有被更新,因?yàn)榧恿耸聞?wù)之后,是在調(diào)用事務(wù)的方法上執(zhí)行完成之后,才會(huì)提交事務(wù),最終因?yàn)閳?bào)錯(cuò),方法沒(méi)有執(zhí)行完,所以事務(wù)沒(méi)有被提交

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

都沒(méi)有被更新,因?yàn)榕扛率情_(kāi)啟了一個(gè)事務(wù),然后統(tǒng)一提交,最后沒(méi)提交成功

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

和情況3相同,都沒(méi)有被更新,全部回滾

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論