纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

星夜孤帆   2021-06-08 我要评论
想了解从Spring源码解析事务失效的原因的相关内容吗星夜孤帆在本文为您仔细讲解Spring事务失效的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Spring事务失效的原因,Spring事务失效下面大家一起来学习吧

一、前言

1.Bean是否是代理对象

2.入口函数是否是public的

3.数据库是否支持事务(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官方文档

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

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

TransactionInterceptor#invoke

TransactionAspectSupport#invokeWithinTransaction

AbstractFallbackTransactionAttributeSource#getTransactionAttribute

AbstractFallbackTransactionAttributeSource#computeTransactionAttribute

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

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

public导致失效原因

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

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

解决方案一:

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

解决方案二:

解决方案三:

使用编程式事务

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

抛出RuntimeException异常事务生效

抛出Exception异常事务不生效

我们看下TransactionInterceptor类

TransactionInterceptor#invoke

TransactionAspectSupport#invokeWithinTransaction

TransactionAspectSupport#completeTransactionAfterThrowing

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

五、异常被catch住

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

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

解决方案一:

catch之后往外抛异常

解决方案二:

catch之后设置手动回滚


相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式