运维开发网

从Spring源码解析事务失效的原因

运维开发网 https://www.qedev.com 2021-06-09 09:24 出处:网络 作者: 星夜孤帆
一、前言 1.Bean是否是代理对象 2.入口函数是否是public的 3.数据库www.cppcns.com是否支持事务(mysql的Mvlsam不支持事务),行锁才支持事务

一、前言

1.Bean是否是代理对象

2.入口函数是否是public的

3.数据库www.cppcns.com是否支持事务(mysql的Mvlsam不支持事务),行锁才支持事务

4.切点是否配置正确

5.内部方法间调用导致事务失效

因为this不是代理对象,可以配置 expose-proxy="true",就可以通过AopContext.currentProxy()获取到当前类的代理对象。

<! -- expose-proxy="true”类内部可以获取到当前类的代理对象--><aop: aspectj-autoproxy expose-proxy="true" />
@Enab1eAspect3AutoProxy(exposeProxy = true)

也可以注入当前bean

6.异常类型是否配置正确

默认只支持RuntimeException和Error,不支持检查异常

想要支持检查异常需要配置rollbackFor

@Transactional(rollbackFor = Exception.class)

7.异常被catch住了

代码中手动catch了异常,然后又未抛出来,此时事务就不生效了。

二、方法不是 public 的

以下来自Spring官方文档

从Spring源码解析事务失效的原因

大概意思就是 @Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。

Spring事务失效8大原因、事务失效原因

从Spring源码解析事务失效的原因

TransactionInterceptor#invoke

从Spring源码解析事务失效的原因

TransactionAsphttp://www.cppcns.comectSupport#invokeWithinTransaction

从Spring源码解析事务失效的原因

AbstractFallbackTransactionAttributeSource#getTransactionAttribute

从Spring源码解析事务失效的原因

AbstractFallbackTransactionAttributeSource#computeTransactionAttribute

从Spring源码解析事务失效的原因

allowPublicMethodsOnly方法由子类AnnotationTransactionAttributeSourc编程客栈e实现,该子类方法中默认是true,所以当你加了事务注解的方法不是public时,该方法直接返回null

以上只说明 在spring的事务管理中存在这样一个 public的判断,至于后边为啥由于这个判断导致没有织入事务,并没有说明;

public导致失效原因

三、内部方法间调用导致事务失效

从Spring源码解析事务失效的原因

因为spring声明式事务是基于AOP实现的,是使用动态代理来达到事务管理的目的,当前类调用的方法上面加@Transactional 这个是没有任何作用的,因为调用这个方法的是this,没有经过 Spring 的代理类。

解决方案一:

再声明一个service,自己注入自己,将内部调用改为外部调用

从Spring源码解析事务失效的原因

解决方案二:

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

解决方案三:

使用编程式事务

从Spring源码解析事务失效的原因

四、异常类型是否配置正确

抛出RuntimeException异常,事务生效

抛出Exception异常,事务不生效

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

我们看下TransactionInterceptor类

TransactionInterceptor#invoke

从Spring源码解析事务失效的原因

TransactionAspectSupport#invokeWithinTransaction

从Spring源码解析事务失效的原因

Transactiwww.cppcns.comonAspectSupport#completeTransactionAfterThrowing

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

从Spring源码解析事务失效的原因

配置了这个,Exception异常的事务,就会生效

从Spring源码解析事务失效的原因

五、异常被catch住

代码中手动catch了异常,然后又未抛出来,此时事务就不生效了。

解决方法:要么不catch需要回滚的异常,要么catch之后再抛出,要么手动回滚

从Spring源码解析事务失效的原因

解决方案一:

catch之后往外抛异常

从Spring源码解析事务失效的原因

解决方案二:

catch之后,设置手动回滚

从Spring源码解析事务失效的原因

到此这篇关编程客栈于从Spring源码解析事务失效的原因的文章就介绍到这了,更多相关Spring事务失效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

0

精彩评论

暂无评论...
验证码 换一张
取 消