報錯內容
org.springframework.dao.TransientDataAccessResourceException: Cannot change the ExecutorType when there is an existing transaction
at org.mybatis.spring.SqlSessionUtils.sessionHolder(SqlSessionUtils.java:157)
at org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:91)
at com.baomidou.mybatisplus.core.toolkit.sql.SqlHelper.sqlSessionBatch(SqlHelper.java:55)
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.sqlSessionBatch(ServiceImpl.java:75)
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.saveOrUpdateBatch(ServiceImpl.java:172)
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.saveOrUpdateBatch(ServiceImpl.java:163)
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl$$FastClassBySpringCGLIB$$76535273.invoke(<generated>)
實際使用方法(錯誤示例)
@Override
@Transactional(rollbackFor = Exception.class)
public BaseResp saveOrUpdate(TestPlanParam param) {
//新增、更新
============================================================
省略業務代碼
============================================================
//1.新增、更新撲火預案(現在增加主表)
this.saveOrUpdate(planEntity);
Integer testPlanId = planEntity.getId();
List<PlanTestTeamEntity> teamEntities=new ArrayList<>();
List<PlanTestResourceEntity> resourceEntities=new ArrayList<>();
//2.新增更新撲火隊伍(批量增加附表,需要掛上主表的id)
teams.forEach(team->{
PlanTestTeamEntity teamEntity=new PlanTestTeamEntity();
BeanUtil.copyProperties(team,teamEntity);
teamEntity.setFireFightTestPlanId(testPlanId);
//planTestTeamService.saveOrUpdate(teamEntity); 解決方法,采用逐條更新
teamEntities.add(teamEntity);
});
//3.新增更新撲火物資(批量增加附表,需要掛上主表的id)
resources.forEach(res->{
PlanTestResourceEntity resourceEntity=new PlanTestResourceEntity();
BeanUtil.copyProperties(res,resourceEntity);
resourceEntity.setFireFightTestPlanId(testPlanId);
//planTestResourceService.saveOrUpdate(resourceEntity); 解決方法,采用逐條更新
resourceEntities.add(resourceEntity);
});
planTestTeamService.saveOrUpdateBatch(teamEntities);
planTestResourceService.saveOrUpdateBatch(resourceEntities);
return BaseResp.success();
}
報錯原因
存在事務時無法更改 ExecutorType
解決方法
批量更新的時候,先把所有更新的對象查出來,然后循環更新