解決MyBatisPlus的updateBatchById()批量修改失效問題
MyBatisPlus的updateBatchById()批量修改失效
1、問題描述
一個(gè)實(shí)現(xiàn)類page分頁查詢方法,一進(jìn)入實(shí)現(xiàn)類page方法先獲取所有的表數(shù)據(jù),再設(shè)置符合條件的數(shù)據(jù)狀態(tài)為1,使用集合收集,再使用updateBatchById()方法批量修改,接著繼續(xù)分頁查詢,按入?yún)l件查詢相關(guān)數(shù)據(jù)返回,結(jié)果批量修改方法未生效。
2、初步判斷
日志顯示有:
c.c.h.b.c.m.BaseMetaObjectHandler :start update fill .... ==> Parameters: 1(String)
判斷:
事務(wù)問題,使用updateBatchById()會有事務(wù)。不知道為什么事務(wù)沒有提交。
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;
}過程
staff_info表里,我通過sql把entry_time字段先設(shè)置成2,然后再通過代碼設(shè)置成0,設(shè)置成2的時(shí)候一共有483條數(shù)據(jù),然后通過代碼修改的時(shí)候,
我把number=0132791的數(shù)據(jù)設(shè)置成null,即更新這一條數(shù)據(jù)肯定會報(bào)錯(cuò),通過debug我知道number=2這條數(shù)據(jù)在更新的list中處于index=141的位置,
所以在number=0132791之后待更新的數(shù)據(jù)還有483-141=342條數(shù)據(jù),如果是通過代碼更新前

- 第一種情況:不加@Transactional注解,使用updateById,一條一條數(shù)據(jù)更新
如下圖:很明顯,在報(bào)錯(cuò)位置之后的記錄里都沒有被更新,報(bào)錯(cuò)位置之前的都被更新了【報(bào)錯(cuò)之前已經(jīng)提交了事務(wù)】 ,報(bào)錯(cuò)之后程序不再運(yùn)行,故后邊數(shù)據(jù)沒更新

- 第二種情況:加@Transactional注解,使用updateById,一條一條數(shù)據(jù)更新
都沒有被更新,因?yàn)榧恿耸聞?wù)之后,是在調(diào)用事務(wù)的方法上執(zhí)行完成之后,才會提交事務(wù),最終因?yàn)閳?bào)錯(cuò),方法沒有執(zhí)行完,所以事務(wù)沒有被提交

- 第三種情況:不加@Transactional注解,使用updateBatchById,批量更新
都沒有被更新,因?yàn)榕扛率情_啟了一個(gè)事務(wù),然后統(tǒng)一提交,最后沒提交成功
- 第四種情況:加@Transactional注解,使用updateBatchById,批量更新
和情況3相同,都沒有被更新,全部回滾
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于紅黑樹插入操作原理及java實(shí)現(xiàn)方法(分享)
下面小編就為大家分享一篇基于紅黑樹插入操作原理及java實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
實(shí)例講解Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式
這篇文章主要介紹了Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式,文中舉了普通代理和強(qiáng)制代理的例子作為代理模式的擴(kuò)展內(nèi)容,需要的朋友可以參考下2016-02-02
SpringBoot3和4的版本新特性及升級要點(diǎn)詳解
Spring Boot 4.0作為生態(tài)內(nèi)的重大更新,基于Spring Framework 6.1+ 構(gòu)建,帶來了一系列顛覆性優(yōu)化,這篇文章主要介紹了SpringBoot3和4的版本新特性及升級要點(diǎn)的相關(guān)資料,需要的朋友可以參考下2026-03-03
jenkins按模塊進(jìn)行構(gòu)建遇到的問題及解決方案
這篇文章主要介紹了jenkins按模塊進(jìn)行構(gòu)建的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Mybatis中foreach標(biāo)簽帶來的空格\換行\(zhòng)回車問題及解決方案
這篇文章主要介紹了解決Mybatis中foreach標(biāo)簽帶來的空格,換行,回車問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
SpringCloud使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用的使用示例
Feign是一個(gè)基于注解的HTTP客戶端庫,它允許您將HTTP請求轉(zhuǎn)換為聲明式的Java接口,本文主要介紹了SpringCloud使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用的使用示例,感興趣的可以了解一下2023-09-09

