java spring事务父方法、子方法各自回滚问题处理


java spring事务父方法、子方法各自回滚问题处理


问题描述

service实现类中A方法(父方法)调用B方法(子方法),两个方法均开启事务,且事务各自独立,A方法和B方法均可自行回滚且相互之间各不干扰。


A方法

注解@Transactional(rollbackFor = Exception.class) 开启A方法的事务

java spring事务父方法、子方法各自回滚问题处理

其中: goodsService.importData3(); 调用B方法或者采用SpringUtils.getAopProxy(this).importData3(); 调用B方法均可以,这里try catch B方法异常是为了防止B方法造成的异常影响到A方法的插入

代码如下:

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Map importData(MultipartFile file, String examId, String subjectId, String seasonId){

        Map map = new HashMap(8);
        //插入业务表信息
        Goods goods = new Goods();
        goods.setName("商品002");
        insertGoods(goods);
        map.put("num1",1);
        map.put("num2",2);
        map.put("num3",3);
        System.out.println(1/0);
        try {
            goodsService.importData3();
            SpringUtils.getAopProxy(this).importData3();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }


B方法

注解@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)开启B方法的新事务,且A方法与B方法不属于同一个事务

java spring事务父方法、子方法各自回滚问题处理

    @Override
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public void importData3() {
        Goods goods = new Goods();
        goods.setName("商品003");
        insertGoods(goods);
        System.out.println(1/0);
    }


注:个人测试有效,大家可以作为参考


上一篇:mybatis开发Dao


下一篇:我来出个题:这个事务会不会回滚?