解決MyBatisPlus的updateBatchById()批量修改失效問(wèn)題
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)文章
Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用
Spring?Boot2.6.0為我們帶來(lái)很多好用的新特性/改進(jìn),這篇文章主要給大家介紹了關(guān)于Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02在Java Web項(xiàng)目中添加定時(shí)任務(wù)的方法
在Java Web程序中加入定時(shí)任務(wù),這里介紹兩種方式使用監(jiān)聽(tīng)器注入,使用Spring注解@Scheduled注入,需要的朋友可以參考下2018-01-01解決找不到符號(hào) 符號(hào):變量 log問(wèn)題
這篇文章主要介紹了解決找不到符號(hào) 符號(hào): 變量 log問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08mall整合SpringTask實(shí)現(xiàn)定時(shí)任務(wù)的方法示例
這篇文章主要介紹了mall整合SpringTask實(shí)現(xiàn)定時(shí)任務(wù)的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06SpringBoot結(jié)果封裝和異常攔截的實(shí)現(xiàn)示例
SpringBoot 項(xiàng)目中,我們通常需要將結(jié)果數(shù)據(jù)封裝成特定的格式,以方便客戶(hù)端進(jìn)行處理,本文主要介紹了SpringBoot?優(yōu)雅的結(jié)果封裝和異常攔截,感興趣的可以了解一下2023-08-08springBoot 打war包 程序包c(diǎn)om.sun.istack.internal不存在的問(wèn)題及解決方案
這篇文章主要介紹了springBoot 打war包 程序包c(diǎn)om.sun.istack.internal不存在的問(wèn)題及解決方案,親測(cè)試過(guò)可以,需要的朋友可以參考下2018-07-07springboot無(wú)法跳轉(zhuǎn)頁(yè)面的問(wèn)題解決方案
這篇文章主要介紹了springboot無(wú)法跳轉(zhuǎn)頁(yè)面的問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09springboot發(fā)送郵件功能的實(shí)現(xiàn)代碼
發(fā)郵件是一個(gè)很常見(jiàn)的功能,在java中實(shí)現(xiàn)需要依靠JavaMailSender這個(gè)接口,今天通過(guò)本文給大家分享springboot發(fā)送郵件功能的實(shí)現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧2021-07-07