spring事务配置不回滚&回滚异常问题

spring事务配置不回滚

spring事务管理配置,一般来说都是可以回滚的,最近在开发的过程中遇到了一个异常不回滚的问题,最终找到了原因,贴出来一下

1、首先这里定义一个接口

定义接口
在接口中定义几个方法

2、然后实现这个接口

接口实现
在实现的接口方法中,引用一个只在实现类中定义的方法,并添加了事务管理注解。
实现类中的方法

3、这里声明了dubbo服务,便于远程调用

dubbo服务声明
当这个doTransfer的方法中发生异常时,并没有执行回滚操作
找了许久,最后通过IDEA对配置文件Spring的事务管理配置

的便捷性按钮上找到问题,如下:
点击 m 标志

查询到标记事务管理的方法名称列表:

而doTransfer并没有在其中,原因是这里spring拿到的bean是定义的接口,所能管理到的也只能是接口中定义的方法,在实现类中直接定义的方法,没有在父类中定义,所以spring容器拿不到这个方法名,也便管理不到,所以出现事务操作异常后不会滚的现象。

事务异常 Transaction rolled back because it has been marked as rollback-only

spring事务配置不回滚&回滚异常问题_第1张图片
问题分析:双层事务,内部事务异常,外层事务中捕获后未抛出,而继续提交外层事务,则会出现该异常信息
即:A方法存在事务管理,且A方法中调用的B方法也存在事务管理,但A方法对B方法的事务异常做了捕获不处理抛出的操作,导致B方法中事务异常后,A方法中继续提交事务,而此时B方法的事务是不允许提交的,因此便会抛出该异常。
解决:将底层内部事务的异常捕获后直接抛出,不再进行外层事务的提交。

你可能感兴趣的:(spring,java)