// @Transactional(rollbackFor = Exception.class)
public Boolean test() {
List<StaffInfo> staffInfos = this.list();
staffInfos = staffInfos.stream().map(staffInfo -> {
if(staffInfo.getNumber().equals("0132791")) { //如果number=0132791,则把元素设置成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字段先设置成2,然后再通过代码设置成0,设置成2的时候一共有483条数据,然后通过代码修改的时候,我把number=0132791的数据设置成null,即更新这一条数据肯定会报错,通过debug我知道number=2这条数据在更新的list中处于index=141的位置,所以在number=0132791之后待更新的数据还有483-141=342条数据,如果是通过代码更新前
第一种情况: 不加@Transactional注解,使用updateById,一条一条数据更新
如下图:很明显,在报错位置之后的记录里都没有被更新,报错位置之前的都被更新了【报错之前已经提交了事务】 ,报错之后程序不再运行,故后边数据没更新
第二种情况: 加@Transactional注解,使用updateById,一条一条数据更新
都没有被更新,因为加了事务之后,是在调用事务的方法上执行完成之后,才会提交事务,最终因为报错,方法没有执行完,所以事务没有被提交
第三种情况: 不加@Transactional注解,使用updateBatchById,批量更新
都没有被更新,因为批量更新是开启了一个事务,然后统一提交,最后没提交成功
第四种情况: 加@Transactional注解,使用updateBatchById,批量更新 文章来源:https://www.toymoban.com/news/detail-532741.html
和情况3相同,都没有被更新,全部回滚 文章来源地址https://www.toymoban.com/news/detail-532741.html
纯粹为了自己记录
到了这里,关于mybatis-plus使用updateBatchById小记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!