springboot中事务是如何工作的

190 阅读1分钟

1、几个核心类

AopAutoConfiguration
org.aspectj.weaver.Advice
AspectJAutoProxyingConfiguration
@EnableAspectJAutoProxy
AspectJAutoProxyRegistrar
AnnotationAwareAspectJAutoProxyCreator
    AspectJAwareAdvisorAutoProxyCreator
        AbstractAdvisorAutoProxyCreator
            AbstractAutoProxyCreator(入口)
                SmartInstantiationAwareBeanPostProcessor(1)
                    InstantiationAwareBeanPostProcessor(2)
                        BeanPostProcessor(3)

(1)的实现方法:
    predictBeanType---
    determineCandidateConstructors---
    getEarlyBeanReference
(2)的实现方法:
    postProcessBeforeInstantiation---1
    postProcessAfterInstantiation---2
    postProcessProperties---33)的实现方法:
    postProcessBeforeInitialization---4
    postProcessAfterInitialization---5

BeanFactoryTransactionAttributeSourceAdvisor
    AbstractBeanFactoryPointcutAdvisor
        AbstractPointcutAdvisor
            PointcutAdvisor
                Advisor

2、大概过程

 找到Advisor;
 创建代理对象;

3、spring boot中如何开启事务

 1、标注@EnableTransactionManagement
 2、Import TransactionManagementConfigurationSelector
     2-1、Import AutoProxyRegistrar(62-2、Import ProxyTransactionManagementConfiguration(3453、BeanFactoryTransactionAttributeSourceAdvisor
 4、AnnotationTransactionAttributeSource
 5、TransactionInterceptor
 6、InfrastructureAdvisorAutoProxyCreator
 

企业微信20210416-180830.png

7、AbstractAutoProxyCreator
    7-1、找出指定bean对应的增强器:
    AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean
        |
    AbstractAdvisorAutoProxyCreator#findEligibleAdvisors
        |
    AbstractAdvisorAutoProxyCreator#findCandidateAdvisors
        |
    BeanFactoryAdvisorRetrievalHelper#findAdvisorBeans(获得所有的Advisor,排除正在创建的)
        |
    AbstractAdvisorAutoProxyCreator#findAdvisorsThatCanApply
        |
    AopUtils#findAdvisorsThatCanApply(得到对应的Advisor)---8
        |
    AspectJAwareAdvisorAutoProxyCreator#extendAdvisors
        |
    AbstractAdvisorAutoProxyCreator#sortAdvisors(排序)
        |
    返回得到的增强器
 8、对于如何得到对应的增强器:
     8-1、首先处理IntroductionAdvisor类型的
     8-2、处理PointcutAdvisor类型(就是上面的3)
     8-3、获取上面那步的Pointcut(通过4创建TransactionAttributeSourcePointcut)
     AbstractFallbackTransactionAttributeSource#getTransactionAttribute
         |
     AbstractFallbackTransactionAttributeSource#computeTransactionAttribute
         |
     AnnotationTransactionAttributeSource#findTransactionAttribute
         |
     AnnotationTransactionAttributeSource#determineTransactionAttribute
         |
     SpringTransactionAnnotationParser#parseTransactionAnnotation(看到了Transactional注解)
     事务属性的获取规则:
         方法中存在,就使用方法上的;
         否则使用方法所在类上的;
         在使用接口中的;
         接口的类上的
 9、SpringTransactionAnnotationParser
     
     parseTransactionAnnotation方法解析出下面属性:
         propagation:
         isolation
         timeout
         readOnly
         value
         rollbackFor
         rollbackForClassName
         noRollbackFor
         noRollbackForClassName
     构造出RuleBasedTransactionAttribute
 10、下面就该看看实际的增强器,就是上面一直没说到的5TransactionInterceptor
 
     核心方法:invoke
         |
     TransactionAspectSupport#invokeWithinTransaction
 11、事务的传播行为:
     PROPAGATION_REQUIRED
     PROPAGATION_SUPPORTS
     PROPAGATION_MANDATORY
     PROPAGATION_REQUIRES_NEW
     PROPAGATION_NOT_SUPPORTED
     PROPAGATION_NEVER
     PROPAGATION_NESTED
 12、隔离级别:
     ISOLATION_DEFAULT
     ISOLATION_READ_UNCOMMITTED
     ISOLATION_READ_COMMITTED
     ISOLATION_REPEATABLE_READ
     ISOLATION_SERIALIZABLE