Spring事务分析

一、事务分析

1.1 情形一

    /**
     * 第一种情况: 外层方法,内层方法都没事务,外层方法抛出异常;
     * 结果: 外层方法插入成功,报错以后,内层方法不执行,未插入成功;
     */
    public void outerTransaction() {
        savePerson("outer");
        arithmeticException();
        innerTransaction();
    }
    
    public void innerTransaction() {
        savePerson("inner");
    }

1.2 情形二

    /**
     * 第二种情况: 外层方法,加事务,内层方法未加事务注解,外层方法抛出异常;
     * 结果: 外层方法回滚,报错以后,内层方法不执行,内外层都未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        arithmeticException();
        innerTransaction();
    }

    public void innerTransaction() {
        savePerson("inner");
    }

1.3 情形三

    /**
     * 第三种情况: 外层方法,内层方法都未加Transaction,内层方法抛异常;
     * 结果: outer和inner都插入成功;
     */
    public void outerTransaction() {
        savePerson("outer");
        innerTransaction();
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.4 情形四

    /**
     * 第四种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常;
     * 结果: outer和inner都未插入成功,事务回滚;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        innerTransaction();
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.5 情形五

    /**
     * 第五种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常, 外层方法对内层方法try catch;
     * 结果: 事务失效,outer和inner都插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.6 情形六

    /**
     * 第六种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常, 外层方法对内层方法try catch,但是把异常抛了出来;
     * 结果: 事务回滚,outer和inner都未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.7 情形七

    /**
     * 第七种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常, 外层方法对内层方法try catch, 但是手动开启rollBack;
     * 结果: 事务回滚,outer和inner都未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.8 情形八

    /**
     * 第八种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常, 外层方法对内层方法try catch,并对内层方法自己注入自己;
     * 结果: 事务未回滚,outer和inner插入成功,inner1报错之后,未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
        savePerson("inner1");
    }

1.9 情形九

    /**
     * 第九种情况: 内外层方法加Transaction,内层方法抛异常, 外层方法对内层方法try catch,并对内层方法自己注入自己;
     * 结果: 事务回滚,inner,inner1,outer都未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Transactional
    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
        savePerson("inner1");
    }

1.10 情形十

    /**
     * 第十种情况: 内外层方法加Transaction,外层方法对内层方法try catch,并对内层方法自己注入自己,try里抛出异常;
     * 结果: 事务未回滚,异常被catch事务失效;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
            arithmeticException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Transactional
    public void innerTransaction() {
        savePerson("inner");
        savePerson("inner1");
    }

1.11 情形十一

    /**
     * 第十一种情况: 内外层方法加Transaction,内层也抛异常,外层方法对内层方法try catch,并对内层方法自己注入自己,try里抛出异常;
     * 结果: 事务回滚,被重新标记为rollback;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
            arithmeticException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Transactional
    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
        savePerson("inner1");
    }

1.12 情形十二

    /**
     * 第十二种情况: 外层方法加Transaction,内层方法加requere_new, 内层也抛异常,外层方法对内层方法try catch,并对内层方法自己注入自己,try里抛出异常;
     * 结果: 内层事务回滚,外层事务失效;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
            arithmeticException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
        savePerson("inner1");
    }

源码

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值