spring异常事务处理机制

1、事务注解一般用在业务层

2、在业务逻辑中抛出的异常若是被try-catch了,事务是无法回滚的,所以正确的操作是在遇到异常场景需要回滚时,手动抛出RuntimeException(默认情况下Spring 中的事务处理只对RuntimeException 方法进行回滚,所以,如果
将Runtime Exception 替换成普通的Exception 不会产生回滚效果。 )

3、spring中的事务是以AOP为基础的,是应用代理模式实现的

4、Spring实现事务时,提取事务标签的顺序为:方法事务声明-->方法所在类事务声明-->接口方法事务声明-->接口方法所在类事务声明

5、对于事务处理,最重要的是要获取事务对应的属性,如果没有事务对应的属性值,事务将无从处理,事务的所有信息从创建事务开始就保存在transactionInfo中,包括事务回滚都要依赖该信息进行处理。

6、事务回滚处理(Spring处理异常事务机制)

    (1)事务回滚条件

        Spring事务异常处理机制只会对RuntimeException 和Error 级别的异常执行回滚操作,执行具体回滚的函数如下:

       public boolean rollbackOn(Throwable ex) {
                    return (ex instanceof RuntimeException || ex instanceof Error);
       }

      当然我们可以对上述两种类型的异常进行扩展处理,达到自己对指定常的回滚,并利用注解的方式实现

     @Transactional(rollbackFor =  xxxException.class)

    (2)事务回滚处理 两步:

        触发器监听函数    

      执行真正的回滚操作,在执行回滚操作的时候要考虑是否有嵌套事务(根据       savePoint来判断,若有嵌套事务,则对嵌套事务单独进行回滚,不回滚外事务。)

    (3) 回滚后的信息清除   无论事务是否回滚成功都必须执行

         设置事务状态为完成,避免事务重复执行

         如果当前事务是新的同步状态,则将事务信息从当前线程中清除掉

         释放事务占用的资源(数据库连接资源等)

        如果在当前事务事前有事务挂起,需要将挂起的事务恢复

    https://refactoringguru.cn/design-patterns/chain-of-responsibility