spring事务@Transactional回滚

本文深入探讨了Java中RuntimeException与Exception的区别,详细解释了运行时异常与受检异常的概念,以及它们如何影响事务的回滚机制。特别是对于@Transactional注解的方法,文章分析了在不同情况下(如直接抛出、try捕捉后、手动抛出RuntimeException)事务是否会被回滚的细节。

在此,首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:

       ①在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类;

       ②RuntimeException,即运行时异常,为非受检(UNCHECKED)异常;

       ③Exception的其他子类异常,为非运行时异常,为受检异常(CHECKED)异常;

    ①被拦截方法-—— 注解式:方法或者方法所在类被@Transactional注解;

                                                   拦截配置式:<tx:method />应该包含对该方法,名称格式的定义;

                                                                       且方法需要在expression定义的范围内;

                    ②异常—— 该方法的执行过程必须出现异常,这样事务管理器才能被触发,并对此做出处理;

                    ③指定异常——  默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,做出回滚。

                                              一般的Exception这些Checked异常不会发生回滚(如果一般Exception想回滚要做出配置);
    ④异常抛出—— 即方法中出现的指定异常,只有在被事务管理器捕捉到以后,事务才会据此进行事务回滚;

         1,不捕捉,会回滚://程序报错

         2,如果异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚;//try{]捕捉之后需要手动回滚

   3,如果异常被try{}捕捉了,我们还可以在Catch(){}中throw   new  RuntimeException(),手动抛出运行时异常供事务管理器捕捉;   //手动抛出异常也也会导致程序中断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值