- spring中如果启动了事务,在执行方法的会进入下面的方法
org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction
- 获取事务配置管理器
TransactionAttributeSource tas = getTransactionAttributeSource();
获取事务配置类的实例,TransactionAttributeSource接口只包含一个方法即
TransactionAttribute getTransactionAttribute(Method method, @Nullable Class<?> targetClass);
可以根据代理对象的类和方法来获取方法上是否有事务配置,作者一般使用NameMatchTransactionAttributeSource即按照方法名称匹配事务,所以此处获取到的tas就是一个NameMatchTransactionAttributeSource的实例
- 获取事务配置实例
final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null);
此处使用上面获取到的事务配置管理器来获取该方法上的具体配置,TransactionAttribute继承自TransactionDefinition,里面配置了事务隔离机制,隔离级别,超时时间,是否只读等
- 获取事务管理器
final PlatformTransactionManager tm = determineTransactionManager(txAttr);
获取到事务配置以后就会根据事务配置来获取具体的事务管理器,展开determineTransactionManager方法如下
protected PlatformTransactionManager determineTransactionManager(@Nullable TransactionAttribute txAttr) {
// Do not attempt to lookup tx manager if no tx attributes are set
if (txAttr == null || this.beanFactory == null) {
return 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 defaultTrans