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