事务源码解析

一、事务概念:和调用入口说明
1.ACID;
atomicity- 原子性,consistency - 一致性,lsolation- 隔离性,durability - 持久性;
一致性:事务将数据库从一个一致状态转移到另一个一致状态;

2.Spring事务三大接口:
PlatformTransactionManager:事务管理器;通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供对应的事务管理器,但具体的实现由各个平台实现;
TransactionDefinition:事务定义信息(事务隔离级别–传播行为–超时–只读–回滚原则);
TransactionStatus:事务运行状态;

3.@EnabelTransactionManagement 注解详解;
@Import(TransactionManagentConfigurationSelector.class)
–AutoProxyRegistrar -->InfrastructureAdvisorAutoProxyCreator
–ProxyTransactionManagementConfiguration类(3个方法返回值:BeanFactoryTransactionAttributeSourceAdvisor–TransactionAttributeSource–TransactionInterceptor)
3.1:InfrastructureAdvisorAutoProxyCreator 具体分析;Aware接口(代表BeanFactoryAware),InstantiationAwareBeanPostProcessor后置处理器;

1.
/******************** 事务管理器 *******************/
public interface PlatformTransactionManager {
   
//获取事务的状态
    TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException;
//事务提交
    void commit(TransactionStatus var1) throws TransactionException;
//事务回滚
    void rollback(TransactionStatus var1) throws TransactionException;
}


/******************** 事务定义信息 *******************/
public interface TransactionDefinition {
   
//支持当前事物,若当前没有事物就创建一个事物
    int PROPAGATION_REQUIRED = 0;
    //如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
    int PROPAGATION_SUPPORTS = 1;
    //如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
    int PROPAGATION_MANDATORY = 2;
    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;
    int PROPAGATION_NESTED = 6;
    /***
      ** 上面-传播行为
      ** 下面-隔离级别
      **/
    int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
    //使用默认的超时时间
    int TIMEOUT_DEFAULT = -1;
//获取事务的传播行为
    int getPropagationBehavior();
//获取事务隔离级别
    int getIsolationLevel();
//获取事务超时时间
    int getTimeout();
//返回当前事务是否为只读
    boolean isReadOnly();
//获取事务名称
    String getName();
}

/******************** 事务运行的状态 *******************/
public interface TransactionStatus extends SavepointManager, Flushable {
   
//是否为新事物
    boolean isNewTransaction();
//是否有保存点
    boolean hasSavepoint();
//设置为只回滚
    void setRollbackOnly();
//是否为只回滚
    boolean isRollbackOnly();

    void flush();
//判断当前事务是否已经完成
    boolean isCompleted();
}
1.@EnableTransactionManagement

2.//通过@Import(.),导入了2. TransactionManagementConfigurationSelector.class
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
   

3.public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> {
   

	/**
	 * Returns {@link ProxyTransactionManagementConfiguration} or
	 * {@code AspectJTransactionManagementConfiguration} for {@code PROXY}
	 * and {@code ASPECTJ} values of {@link EnableTransactionManagement#mode()},
	 * respectively.
	 */
	@Override
	protected String[] selectImports(AdviceMode adviceMode) {
   
		switch (adviceMode) {
   
		//默认的配置是proxy
			case PROXY:
				return new String[] {
   AutoProxyRegistrar.class.getName(),
						ProxyTransactionManagementConfiguration.class.getName()};
			case ASPECTJ:
				return new String[] {
   
						TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME};
			default:
				return null;
		}
	}

}

4.//AutoProxyRegistrar为我们容器注册了一个InfrastructureAdvisorAutoProxyCreator组件
public class AutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
   
AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
}
public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry) {
   
        return registerAutoProxyCreatorIfNecessary(registry, (Object)null);
    }

  public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) {
   
        return registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source);
    }

5.public class InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator {
   
    private ConfigurableListableBeanFactory beanFactory;



InfrastructureAdvisorAutoProxyCreator继承图:
在这里插入图片描述

InfrastrureAdvisorAutoProxyCreator:
1.InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator {
   
    private ConfigurableListableBeanFactory beanFactory;

    public InfrastructureAdvisorAutoProxyCreator() {
   
    }
//重写父类的
    protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
   
        super.initBeanFactory(beanFactory);
        this.beanFactory = beanFactory;
    }
2.	class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator {
   
3.	class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
   
4.	interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
   
5.	public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
   
6.	AbstractAutoProxyCreator 实现了BeanFactoryAware ;但是又马上被AbstractAdvisorAutoProxyCreator 重写; 

public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator {
   
    private BeanFactoryAdvisorRetrievalHelper advisorRetrievalHelper;

    public AbstractAdvisorAutoProxyCreator() {
   
    }
//重写方法
    public void setBeanFactory(BeanFactory beanFactory) {
   
        super.setBeanFactory(beanFactory);
        if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
   
            throw new IllegalArgumentException("AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);
        } else {
   
            this.initBeanFactory((ConfigurableListableBeanFactory)beanFactory);
        }
    }
6.AbstractAdvisorAutoProxyCreator实现了InstantiationAwareBeanPostProcessor 类型的后置处理器;
6.1:

        Object cacheKey = this.getCacheKey(beanClass, beanName);
        if (beanName == null || !this.targetSourcedBeans.contains(beanName)) {
   
            if (this.advisedBeans.containsKey(cacheKey)) {
   
                return null;
            }

            if (this.isInfrastructureClass(beanClass) || this.shouldSkip(beanClass, beanName)) {
   
                this.advisedBeans.put(cacheKey, Boolean.FALSE);
                return null;
            }
        }

        if (beanName != null) {
   
            TargetSource targetSource = this.getCustomTargetSource(beanClass, beanName);
            if (targetSource != null) {
   
                this.targetSourcedBeans.add(beanName);
                Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
                Object proxy = this.createProxy(beanClass, beanName, specificInterceptors, targetSource);
                this.proxyTypes.put(cacheKey, proxy.getClass());
                return proxy;
            }
        }

        return null;
    }

6.2:postProcessAfterInstantiation方法
public boolean postProcessAfterInstantiation(Object bean, String beanName) {
   
        return true;
    }

7.BeanPostProcessor 类型后置处理器,为容器做了什么
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
   
        if (bean != null) {
   
            Object cacheKey = this.</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值