Spring事务原理解析

1.@EnableTransactionManagement原理
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
}

​ 可以看出@EnableTransactionManagement利用TransactionManagementConfigurationSelector给容器中会导入组件.
​ 会导入两个组件AutoProxyRegistrarProxyTransactionManagementConfiguration

  1. AutoProxyRegistrar
    会给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件
    利用后置处理器机制在对象创建以后,包装对象, 返回一个代理对象(增强器),代理对象执行方法利用拦截器进行调用.,过程在上篇AOP中有详细介绍

  2. ProxyTransactionManagementConfiguration
    是个配置类

    @Configuration
    public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
    
      //1.给容器注册一个事物增强器 
       @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
       @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
       public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
          BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
         //1.1 首先注册了AnnotationTransactionAttributeSource,解析事物注解的信息1.
          advisor.setTransactionAttributeSource(transactionAttributeSource());
         //1.2设置事务拦截器
          advisor.setAdvice(transactionInterceptor());
          if (this.enableTx != null) {
             advisor.setOrder(this.enableTx.<Integer>getNumber("order"));
          }
          return advisor;
       }
    
      //解析事物注解的信息
       @Bean
       @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
       public TransactionAttributeSource transactionAttributeSource() {
          return new AnnotationTransactionAttributeSource();
       }
    //设置事务拦截器
       @Bean
       @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
       public TransactionInterceptor transactionInterceptor() {
          TransactionInterceptor interceptor = new TransactionInterceptor();
          interceptor.setTransactionAttributeSource(transactionAttributeSource());
          if (this.txManager != null) {
             interceptor.setTransactionManager(this.txManager);
          }
          return interceptor;
       }
    
    }
    
    1. 给容器中注册事务增强器

      1. 事务增强器要用事务注解的信息,
        AnnotationTransactionAttributeSource解析事物注解的信息
        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNAcfS1d-1575821134910)(/Users/laiyanxin/Library/Application Support/typora-user-images/image-20191208233609659.png)]

      2. 事务拦截器
        TransactionInterceptor保存了事务属性信息,事务管理器

        他是一个MethodInterceptor,在目标执行的时候,会包装成拦截器链,执行拦截器链

        这个拦截器链只有一个TransactionInterceptor事务拦截器

        • 先获取事务相关属性

        • 再获取PlatformTransactionManager,如果事先没有添加执行任务TransactionManager,最终会从容器中按照类型获取一个PlatformTransactionManager

        • 执行目标方法,如果异常获取到事务管理器,利用事务管理器回滚
          txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());

          如果征程获取到事务管理器,利用事务管理器提交事务
          txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());

    //执行目标方法时候核心代码 invokeWithinTransaction
    protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,
    			final InvocationCallback invocation) throws Throwable {
    
      TransactionAttributeSource tas = getTransactionAttributeSource();
    		final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null);
      //获取到事务管理器
    		final PlatformTransactionManager tm = determineTransactionManager(txAttr);
      //获取到执行的方法
    		final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);
    
    		if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
    			// 如果是必要的就开启事务,通过事物管理器
    			TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
    			Object retVal = null;
    			try {
    				//执行事务方法
    				retVal = invocation.proceedWithInvocation();
    			}
    			catch (Throwable ex) {
    				// 执行遇到异常,利用事务管理器回滚
    				completeTransactionAfterThrowing(txInfo, ex);
    				throw ex;
    			}
    			finally {
    				cleanupTransactionInfo(txInfo);
    			}
          //如果正常,利用事务管理器提交事务
    			commitTransactionAfterReturning(txInfo);
          //里面逻辑txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
    			return retVal;
    		}
    	}
    
2.总结
  1. 首先通过AutoProxyRegistrar注册了InfrastructureAdvisorAutoProxyCreator,后置处理器,利用后置处理机制帮我们包装了一个代理对象
  2. 在通过注册ProxyTransactionManagementConfiguration配置,为我们注册了一个事物增强器.事物增强器包含了事物拦截器,事务信息等等,
  3. 代理对象执行目标方法,会被拦截器拦截,通过事务 管理器来开启事务,遇到异常,利用事务管理回滚事务,如果正常,利用事务管理器提交事务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值