解決MyBatisPlus的updateBatchById()批量修改失效問題
MyBatisPlus的updateBatchById()批量修改失效
1、問題描述
一個實現(xiàn)類page分頁查詢方法,一進(jìn)入實現(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()單個數(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的時候一共有483條數(shù)據(jù),然后通過代碼修改的時候,
我把number=0132791的數(shù)據(jù)設(shè)置成null,即更新這一條數(shù)據(jù)肯定會報錯,通過debug我知道number=2這條數(shù)據(jù)在更新的list中處于index=141的位置,
所以在number=0132791之后待更新的數(shù)據(jù)還有483-141=342條數(shù)據(jù),如果是通過代碼更新前
- 第一種情況:不加@Transactional注解,使用updateById,一條一條數(shù)據(jù)更新
如下圖:很明顯,在報錯位置之后的記錄里都沒有被更新,報錯位置之前的都被更新了【報錯之前已經(jīng)提交了事務(wù)】 ,報錯之后程序不再運行,故后邊數(shù)據(jù)沒更新
- 第二種情況:加@Transactional注解,使用updateById,一條一條數(shù)據(jù)更新
都沒有被更新,因為加了事務(wù)之后,是在調(diào)用事務(wù)的方法上執(zhí)行完成之后,才會提交事務(wù),最終因為報錯,方法沒有執(zhí)行完,所以事務(wù)沒有被提交
- 第三種情況:不加@Transactional注解,使用updateBatchById,批量更新
都沒有被更新,因為批量更新是開啟了一個事務(wù),然后統(tǒng)一提交,最后沒提交成功
- 第四種情況:加@Transactional注解,使用updateBatchById,批量更新
和情況3相同,都沒有被更新,全部回滾
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用
Spring?Boot2.6.0為我們帶來很多好用的新特性/改進(jìn),這篇文章主要給大家介紹了關(guān)于Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02mall整合SpringTask實現(xiàn)定時任務(wù)的方法示例
這篇文章主要介紹了mall整合SpringTask實現(xiàn)定時任務(wù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06SpringBoot結(jié)果封裝和異常攔截的實現(xiàn)示例
SpringBoot 項目中,我們通常需要將結(jié)果數(shù)據(jù)封裝成特定的格式,以方便客戶端進(jìn)行處理,本文主要介紹了SpringBoot?優(yōu)雅的結(jié)果封裝和異常攔截,感興趣的可以了解一下2023-08-08springBoot 打war包 程序包com.sun.istack.internal不存在的問題及解決方案
這篇文章主要介紹了springBoot 打war包 程序包com.sun.istack.internal不存在的問題及解決方案,親測試過可以,需要的朋友可以參考下2018-07-07springboot無法跳轉(zhuǎn)頁面的問題解決方案
這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09springboot發(fā)送郵件功能的實現(xiàn)代碼
發(fā)郵件是一個很常見的功能,在java中實現(xiàn)需要依靠JavaMailSender這個接口,今天通過本文給大家分享springboot發(fā)送郵件功能的實現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧2021-07-07