Spring源码分析之事务处理

1.TxNamespaceHandler的TxAdviceBeanDefinitionParser定义了TransactionInterceptor 的BeanDefinition
2.TxAdviceBeanDefinitionParser定义了transactionManager和transactionAttributeSource
3.通过transactionManager处理事务:getTransaction、commit、rollback
4.通过transactionAttributeSource决定事务属性
   1.获取TransactionAttribute
   2.TransactionAttribute定义了:Propagation、Isolation、Timeout等

public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
   	public TransactionInterceptor(PlatformTransactionManager ptm, Properties attributes) {
   		setTransactionManager(ptm);
   		setTransactionAttributes(attributes);
          ->NameMatchTransactionAttributeSource tas = new NameMatchTransactionAttributeSource();
          ->tas.setProperties(transactionAttributes);
          ->this.transactionAttributeSource = tas;
   	}
    
    public Object invoke(final MethodInvocation invocation) throws Throwable {
        final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(invocation.getMethod(), targetClass);
/*====================================== 匹配方法对应的属性_S ====================================================*/
          ->getTransactionAttributeSource() --是NameMatchTransactionAttributeSource
          ->.getTransactionAttribute(invocation.getMethod(), targetClass);
            ->String methodName = method.getName();
            ->for (String mappedName : this.nameMap.keySet())
              ->if (isMatch(methodName, mappedName)...)
                ->attr = this.nameMap.get(mappedName);
            ->return attr;
/*====================================== 匹配方法对应的属性_E ====================================================*/
/*==================================== 获取TransactionManager_S =================================================*/
        final PlatformTransactionManager tm = determineTransactionManager(txAttr);    --tm默认是DataSourceTransactionManager
          ->return this.beanFactory.getBean(this.transactionManagerBeanName, PlatformTransactionManager.class);
/*==================================== 获取TransactionManager_E =================================================*/
        final String joinpointIdentification = methodIdentification(invocation.getMethod(), targetClass);
          -> 
        if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
            TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
              ->status = tm.getTransaction(txAttr);
                ->Object transaction = doGetTransaction();
                  ->DataSourceTransactionObject txObject = new DataSourceTransactionObject();
                  ->txObject.setSavepointAllowed(isNestedTransactionAllowed());
                  ->ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(this.dataSource);
                    ->Object value = doGetResource(actualKey);
                      ->Map<Object, Object> map = resources.get();
                      ->Object value = map.get(actualKey);
                      ->return value;
                  ->txObject.setConnectionHolder(conHolder, false);
                  ->return txObject;
                ->DefaultTransactionStatus status = newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);
                ->doBegin(transaction, definition);
                  ->if (txObject.getConnectionHolder() == null || txObject.getConnectionHolder().isSynchronizedWithTransaction())
/*=========================================== 获取数据库连接 ========================================================*/
                     ->Connection newCon = this.dataSource.getConnection();
                     ->txObject.setConnectionHolder(new ConnectionHolder(newCon), true);
                  ->con = txObject.getConnectionHolder().getConnection();
                  ->Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition);
                    ->con.setTransactionIsolation(definition.getIsolationLevel());   //动态设置事务隔离级别
                  ->txObject.setPreviousIsolationLevel(previousIsolationLevel);
/*======================================== 设置成事务非自动提交 =====================================================*/
                  ->con.setAutoCommit(false);
                  ->TransactionSynchronizationManager.bindResource(getDataSource(), txObject.getConnectionHolder());
              ->return prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);
                ->TransactionInfo txInfo = new TransactionInfo(tm, txAttr, joinpointIdentification);
                ->txInfo.newTransactionStatus(status);
                ->txInfo.bindToThread();
                  ->transactionInfoHolder.set(this);
                ->return txInfo;
            try {
				retVal = invocation.proceed();
			}
			catch (Throwable ex) {
				completeTransactionAfterThrowing(txInfo, ex);
				throw ex;
			}
			finally {
				cleanupTransactionInfo(txInfo);
			}
            commitTransactionAfterReturning(txInfo);
              ->txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
                ->DefaultTransactionStatus defStatus = (DefaultTransactionStatus) status;  --【AbstractPlatformTransactionManager】
                ->if (defStatus.isLocalRollbackOnly())
                  ->processRollback(defStatus);  --【AbstractPlatformTransactionManager】
                  ->return;
                ->processCommit(defStatus);
                  ->prepareForCommit(status);
                  ->triggerBeforeCommit(status);
                  ->triggerBeforeCompletion(status);
                  ->doCommit(status);    --【AbstractPlatformTransactionManager】
                    ->DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction();
                    ->Connection con = txObject.getConnectionHolder().getConnection();
/*======================================== 提交事务 =====================================================*/
                    ->con.commit();
                  ->triggerAfterCommit(status);
			return retVal;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值