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;
}
}
}