spring事务底层实现原理,spring @transactional原理

  spring事务底层实现原理,spring @transactional原理

  00-1010简介事务AOP核心类的工作机制说明简介@ TransactionalTransactionAttribute SpringTransactionAnnotation parseran annotation Transaction attribute sourceceptcuttransactioninterceptor bean factory transactionattributesourceadvisorytransactionmanagementconfiguration事务抽象核心类解释平台transactionmanager TransactionStatusTransactionDefinition结论

  00-1010写这篇博文是有原因的。就是为了解决博主遇到的多数据源事务问题(不需要JTA),所以我深入spring-tx的源代码学习,收获很大。最终解决了博主的分布式事务问题。本文是一个开篇,如何处理多数据源事务,下面就要分解了。本文涉及的技术包括spring aop的使用、spring bean的生命周期等。如果能真正理解事务性的工作原理,对排查事务性相关问题会有很大帮助。

  Spring-tx版本:5.0.2

  00-1010让我们先来看一张正式的业务图:

  Spring定义了@Transactional注释,基于AbstractBeanFactoryPointCutAdvisor、StaticMethodMatcherPointcut和MethodInterceptor的aop编程模式,增强了添加@Transactional注释的方法。同时将事务行为抽象为PlatformTransactionManager、TransactionStatus、TransactionDefinition等。在增强方法前后嵌入最终事务的打开、提交和回滚逻辑,完成统一的事务模型管理。

  

目录

 

  00-1010事务注释用于定位aop的入口点。事务注释包含一个完整事务的所有基本属性,例如:

  事务:transactionManager

  传播:传播行为定义,枚举类型,是spring特有的事务行为设计,默认值为PROPAGATION_REQUIRED(支持当前事务,如果不存在,将新建)

  Isolation:隔离级别,对应于数据库的隔离级别。mysql的默认隔离级别是读提交。

  超时:超时,使用数据库默认超时,mysql事务默认超时5分钟。

  ReadOnly:只读,默认为false。

  RollbackFor:异常回滚列表,默认为RuntimeException异常回滚。

  00-1010事务属性抽象接口类,携带@Transactional注释中的所有属性。实现类的继承关系如下图类结构图所示。这个实例将在注释解析器创建后在事务上下文中传递。

  00-1010,这个类是spring的transactionnotationparser,从transactionnotationparser接口实现。它是一个由spring管理的事务解析器。它用于解析@Transactional批注,并将批注中的属性设置为TransactionAttribute的实现类的属性。除此之外,还有另外两个实现,即jta事务注释解析器和EJB事务注释管理解析器。区别在于解析的注释不同。spring是@Transactional,JTA是javax . transaction . Transactional,EJB是javax.ejb.TransactionAttribute这个本地应用和Apache dubbo 2.7 . x版解析Dubbo的@service注释一样。关键代码如下。通过AnnotatedElementUtils类,该类找到spring-core包下的注释属性集AnnotationAttributes。如果它不为空,则被包装为事务属性集并返回。

  @Override@Nullablepubli

  c TransactionAttribute parseTransactionAnnotation(AnnotatedElement element) {AnnotationAttributes attributes = AnnotatedElementUtils.findMergedAnnotationAttributes(element, Transactional.class, false, false);if (attributes != null) {return parseTransactionAnnotation(attributes);}else {return null;}}

 

  

AnnotationTransactionAttributeSource

见名知意,这个类是注解事务属性集的源,怎么理解呢?spring抽象了获取事务属性集的行为,而AnnotationTransactionAttributeSource正是@Transactional注解方式的事务属性集收集实现。SpringTransactionAnnotationParser就是作用于这个里面,用于发现@Transactiona注解的方法

 

  

 

  

TransactionAttributeSourcePointcut

也是见名知意,Pointcut属于aop的概念范畴,需要了解spring aop的知识才能看明白,这个就是@Transactional注解的切点,AnnotationTransactionAttributeSource作用于此,用于寻找@Transactiona注解的方法,关键代码如下:

 

  

public boolean matches(Method method, Class targetClass) {TransactionAttributeSource tas = getTransactionAttributeSource();return (tas == null tas.getTransactionAttribute(method, targetClass) != null);}

 

  

TransactionInterceptor

事务的拦截器。aop编程里,有了切入点Pointcut,就要有通知advice,我们熟悉的spring aop里有前置、后置、环绕、异常等通知类型,TransactionInterceptor属于自定义通知模型实现,实现自Advice接口,类似于环绕通知,具体见类结构图,如下:

 

  

 

  核心方法如下:

  

public Object invoke(MethodInvocation invocation) throws Throwable {// Work out the target class: may be {@code null}.// The TransactionAttributeSource should be passed the target class// as well as the method, which may be from an interface.Class targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);// Adapt to TransactionAspectSupports invokeWithinTransaction...return invokeWithinTransaction(invocation.getMethod(), targetClass, invocation::proceed);}

被@Transactional注解的方法,如果被aop正确的增强了,运行的时候都会进入到这个方法里面,如果你发现事务不生效啊等等问题,可以从这里开始定位真实原因

 

  

 

  

BeanFactoryTransactionAttributeSourceAdvisor

事务增强器,用于增强添加了@Transactional注解的方法,上面提到的这些核心类,最终都作用于这里,用于寻找@Transactional注解的方法和织入事务处理逻辑

 

  

 

  

ProxyTransactionManagementConfiguration

代理事务管理的配置类,上面介绍的这些事务aop编程相关的在这个里面组合配置生效的,同时,如果你有特殊的个性化的需求,也可以自定义注册这个里面的实例。比如我嫌弃@Transactional注解太长了,想用@Tx注解。没关系,直接定义个TransactionAttributeSource实现,解析@Tx的方法,然后注册到spring的上线文中即可。代码如:

 

  

@Configuration(proxyBeanMethods = false)public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)@Role(BeanDefinition.ROLE_INFRASTRUCTURE)public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor(TransactionAttributeSource transactionAttributeSource,TransactionInterceptor transactionInterceptor) {BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();advisor.setTransactionAttributeSource(transactionAttributeSource);advisor.setAdvice(transactionInterceptor);if (this.enableTx != null) {advisor.setOrder(this.enableTx.getNumber("order"));}return advisor;}@Bean@Role(BeanDefinition.ROLE_INFRASTRUCTURE)public TransactionAttributeSource transactionAttributeSource() {return new AnnotationTransactionAttributeSource();}@Bean@Role(BeanDefinition.ROLE_INFRASTRUCTURE)public TransactionInterceptor transactionInterceptor(TransactionAttributeSource transactionAttributeSource) {TransactionInterceptor interceptor = new TransactionInterceptor();interceptor.setTransactionAttributeSource(transactionAttributeSource);if (this.txManager != null) {interceptor.setTransactionManager(this.txManager);}return interceptor;}}

 

  

事务抽象核心类释义

 

  

PlatformTransactionManager

平台事务管理器,这是Spring事务基础设施中的中心接口。它定义了三个最最基本的事务方法,getTransaction获取事务,包含了事务开启的行为,commit提交事务,rollback回滚事务。代码如下:

 

  

public interface PlatformTransactionManager extends TransactionManager {TransactionStatus getTransaction(@Nullable TransactionDefinition definition)throws TransactionException;void commit(TransactionStatus status) throws TransactionException;void rollback(TransactionStatus status) throws TransactionException;}

在spring-tx中并没有提供真正的实现类,只提供了一个抽象派生类AbstractPlatformTransactionManager,并建议其他实现基于这个派生类,因为它预先实现了定义的传播行为并处理事务同步处理。子类必须为底层事务的特定状态实现模板方法,例如:begin、suspend、resume、commit等。我们平时常见的实现有:JpaTransactionManager、JtaTransactionManager、DataSourceTransactionManager等。事务管理器和事务aop处理的逻辑本身没有任何耦合,只需将PlatformTransactionManager实例注册到spring上下文中即可,事务拦截器会通过获取到@Transactional里的transactionManager属性去上下文中寻找事务管理器,并将其缓存起来,见TransactionAspectSupport.java里的determineTransactionManager方法

 

  

protected PlatformTransactionManager determineTransactionManager(@Nullable TransactionAttribute txAttr) {// Do not attempt to lookup tx manager if no tx attributes are setif (txAttr == null this.beanFactory == null) {return asPlatformTransactionManager(getTransactionManager());}String qualifier = txAttr.getQualifier();if (StringUtils.hasText(qualifier)) {return determineQualifiedTransactionManager(this.beanFactory, qualifier);}else if (StringUtils.hasText(this.transactionManagerBeanName)) {return determineQualifiedTransactionManager(this.beanFactory, this.transactionManagerBeanName);}else {PlatformTransactionManager defaultTransactionManager = asPlatformTransactionManager(getTransactionManager());if (defaultTransactionManager == null) {defaultTransactionManager = asPlatformTransactionManager(this.transactionManagerCache.get(DEFAULT_TRANSACTION_MANAGER_KEY));if (defaultTransactionManager == null) {defaultTransactionManager = this.beanFactory.getBean(PlatformTransactionManager.class);this.transactionManagerCache.putIfAbsent(DEFAULT_TRANSACTION_MANAGER_KEY, defaultTransactionManager);}}return defaultTransactionManager;}}

 

  

TransactionStatus

事务状态抽象,用这个类的实现来维护当前的事务状态,spring-tx里提供了默认的实现DefaultTransactionStatus。一般情况下这个不需要我们关心,它和PlatformTransactionManager是成对存在的,心细的你可能已经发现了,PlatformTransactionManager里的三个事务行为传递的就是TransactionStatus。我们知道事务aop增强了添加@Transactional的方法,在执行方法前调用PlatformTransactionManager.getTransaction开启事务,之后调用commit方法提交事务,提交事务的入参TransactionStatus就是开启事务获得的。参见TransactionAspectSupport.java里的createTransactionIfNecessary方法

 

  

 

  

TransactionDefinition

事务定义,对应了TransactionAttribute,最终通过aop得到的TransactionAttribute里的属性会被传递到TransactionDefinition里,所以TransactionDefinition里也包含了所有事务相关的属性,PlatformTransactionManager.getTransaction正是通过这个里面的属性去获取的事务。AbstractPlatformTransactionManager派生类里也是通过这个里面的属性去判断协调spring的事务传播行为的

 

  

 

  

结语

当梳理完spring-tx模块的整个结构和工作方式后,仿佛拉开了spring事务管理的面纱,很多事务的执行细节一览无余。很多事务相关的问题也就很容易解释了。比如常见的类中的方法直接调用方法事务不生效等问题,以及可以非常清晰的理解spring的传播行为的真正含义等。最后预告下,spring对于多数据源的事务处理解决方案ChainedTransactionManager

 

  以上就是spring声明式事务@Transactional底层工作原理的详细内容,更多关于spring声明式事务@Transactional工作原理的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: