Spring事务原理完全解析

栏目: Java · 发布时间: 5年前

内容简介:事务是什么?了解事务的原理吗?说下Spring的事务原理,能自己实现Spring事务原理吗?先自我检测下这些知识掌握了吗。那么接下来一起看下与Spring相关的事务事务具有ACID特性。是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

事务是什么?了解事务的原理吗?说下Spring的事务原理,能自己实现Spring事务原理吗?先自我检测下这些知识掌握了吗。那么接下来一起看下与Spring相关的事务

概念

事务具有ACID特性。

是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

Spring事务的底层依赖 MySQL 的事务,代码层面上利用AOP实现。MySQL的事务有隔离级别的概念,只有InnoDB有事务,并且实现方式是利用undo log和redo log。

AOP方面,有连接点,切点,增强,目标,织入。参考Spring AOP入门,Spring则是在代码层面执行事务的时候使用TransactionInceptor进行拦截,然后处理。

系统解析Spring事务原理文章:

代码

  1. 在AopConfigUtils可以看到具体会生成什么类型的AutoProxyCreator,这几个都是 beanPostProcessor ,在Bean创建之后对Bean的实例进行自定义处理。如果使用了@EnableTransactionManagement,经过一些配置这次生成的是InfrastructureAdvisorAutoProxyCreator,具体如何生成这个类的点进去@EnableTransactionManagement里面即可。
Spring事务原理完全解析
EnableTransactionManagement
-> @Import(TransactionManagementConfigurationSelector.class)
-> return new String[] {AutoProxyRegistrar.class.getName(),
						ProxyTransactionManagementConfiguration.class.getName()};
-> AutoProxyRegistrar.registerBeanDefinitions中
-> 创建InfrastructureAdvisorAutoProxyCreator
复制代码
Spring事务原理完全解析
  1. 在Bean的生命周期中,Bean创建完成调用创建InfrastructureAdvisorAutoProxyCreator.postProcessAfterInitialization方法。

    另外AbstractAutowireCapableBeanFactory.initializeBean方法也值得一看

    获取Bean的Advice,如果有Advice(增强的话),创建bean的动态代理。创建动态代理都是Spring AOP做的事情了,根据设置就是创建JDK动态代理和CGLib代理了,我们项目默认都是使用CGLib动态代理(proxyTargetClass=true即可),只说下CGlib的动态代理,主要利用了Enhancer类

Spring事务原理完全解析

​ 这里有Enhacer用法 Cglib的使用方法(1)--Enhancer

​ 拦截接口intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)有我们根据条件进行是否要拦截的数据,根据参数就可以判断。

  1. 可以跟进去DefaultAdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice方法中看

    PointcutAdvisor为BeanFactoryTransactionAttributeSourceAdvisor
    MethodMatcher为TransactionAttributeSourcePointcut
    复制代码
Spring事务原理完全解析

得到的拦截器为事务拦截器,既然是事务拦截器,那么可以跟上之前的分析了。

Spring事务原理分析

  1. 我们接着看为什么获取的拦截器是MethodInterceptor。在MethodMatcher.match中有AdvisorAdapter
Spring事务原理完全解析

而Advice是advisor中的,advisor是BeanFactoryTransactionAttributeSourceAdvisor

  • 一种在TransactionProxyFactoryBean中默认的TransactionIntercetor
Spring事务原理完全解析
  • 在默认的@EnableTransactionManagement注解中,将BeanFactoryTransactionAttributeSourceAdvisor的advice设置为TransactionIntercetor,这一步的注解生效,我们第一步就已经讲过了。
Spring事务原理完全解析
  1. 方法是如何匹配的,TransactionAttributeSourcePointcut中matches方法,调用TransactionAttributeSource属性判断是否有method的属性
Spring事务原理完全解析

然后调用computeTransactionAttribute(method, targetClass),判断是否有事务属性

AbstractFallbackTransactionAttributeSource.computeTransactionAttribute
--> AnnotationTransactionAttributeSource.determineTransactionAttribute 获取方法属性
--> 获取到TransactionAttribute,然后返回
复制代码
  1. 到现在我们基本上解释了,Spring的事务拦截器是如何生效的,拦截器什么时候设置的,事务方法是如何匹配的。

事务不生效

  • private方法不会生效,JDK中必须是接口,接口中不可能有private方法,而私有方法子类无法方法,也不会生效
  • CGLib代理的时候,final方法不会生效,抛NullPointException
  • protect方法的话,默认是只允许public方法。
Spring事务原理完全解析

最后一个就是在当前的bean中非事务方法调用事务方法为什么不生效?

public int save(String name, int age) throws Exception {
        insert(name, age);
        return 1;
    }
    @Transactional
    public void insert(String name, int age){
        jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(2,'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
    }
复制代码

答:

一般加上有@Transactional注解的bean,默认都会创建为代理的bean,在调用save方法的时候,因为save方法没有加上注解,所以save方法不会被方法拦截器进行拦截。那么调用的时候走的就是正常的调用save方法了。

直接调用insert方法,因为insert有注解,是会被拦截的属于正常的情况,不用过多的解释。

另外方法之所以被拦截是因为有代码逻辑控制,在执行insert之前会判断要不要进行拦截,save方法也是一样的。 直接调用save方法

-> 发现save方法没有增强,不会被拦截

-> 激发调用save方法,此时在save方法的逻辑代码内

-> 直接走进insert方法,而没有对insert进行是否要拦截判断

再说下直接调用insert的是正常情况,会判断是否要拦截,然后事务就会生效了。


以上所述就是小编给大家介绍的《Spring事务原理完全解析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

运营其实很简单:互联网运营进阶之道

运营其实很简单:互联网运营进阶之道

郑文博 / 人民邮电出版社 / 2018-2 / 49.80元

为了帮助从事运营或即将从事运营的广大读者更好、更快地了解运营、学习运营、入职运营,本书详细阐述运营对于用户、企业的帮助,同时以单个理论点 单个实战案例的方式详细分析了社群运营、活动运营、新媒体运营、内容运营、渠道运营、精细化运营、场景化运营、用户化运营、商业化运营等模块及运营工作、渠道整合、社群知识、渠道优化、SOP流程等细节,力求让读者在求职路上快速上手,在迷茫途中快速定位。 《运营其实很简单 ......一起来看看 《运营其实很简单:互联网运营进阶之道》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具