// @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ù)肯定會(huì)報(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í)行完成之后,才會(huì)提交事務(wù),最終因?yàn)閳?bào)錯(cuò),方法沒有執(zhí)行完,所以事務(wù)沒有被提交
第三種情況: 不加@Transactional注解,使用updateBatchById,批量更新
??都沒有被更新,因?yàn)榕扛率情_啟了一個(gè)事務(wù),然后統(tǒng)一提交,最后沒提交成功
第四種情況: 加@Transactional注解,使用updateBatchById,批量更新?文章來源:http://www.zghlxwxcb.cn/news/detail-532741.html
和情況3相同,都沒有被更新,全部回滾?文章來源地址http://www.zghlxwxcb.cn/news/detail-532741.html
純粹為了自己記錄
到了這里,關(guān)于mybatis-plus使用updateBatchById小記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!