使用mybatis批量添加保存報錯Cannot change the ExecutorType when there is an existing transaction


報錯內容

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

解決方法

批量更新的時候,先把所有更新的對象查出來,然后循環更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM