分库分表之ShardingSphere 支持分布式事务 源码分析

1. 事务相关配置

@EnableTransactionManagement  // 支持spring事务
@SpringBootApplication(scanBasePackages = "com.example.shard")
public class ShardJdbcApplication {

  .....

}

@ShardingTransactionType(TransactionType.XA)  // 执行shardsphere的分布式事务

@Transactional(rollbackFor = Exception.class)  // 该方法开启事务

@Override

public int insert(){

...

}

2.  EnableTransactionManagement注解分析

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({TransactionManagementConfigurationSelector.class})
public @interface EnableTransactionManagement {
    boolean proxyTargetClass() default false;

    AdviceMode mode() default AdviceMode.PROXY;

    int order() default 2147483647;
}

该注解主要依赖@Import中指定的类TransactionManagementConfigurationSelector来实现

TransactionManagementConfigurationSelector源码如下:

public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> {
    public TransactionManagementConfigurationSelector() {
    }

    protected String[] selectImports(AdviceMode adviceMode) {
        switch(adviceMode) {
        case PROXY:
            return new String[]{AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()};
        case ASPECTJ:
            return new String[]{"org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration"};
        default:
            return null;
        }
    }
}

debug发现默认使用的adviceMode为PROXY

 

然后加载两个类 AutoProxyRegistrar和ProxyTransactionManagementConfiguration

ProxyTransactionManagementConfiguration分析

@Bean(
    name = {"org.springframework.transaction.config.internalTransactionAdvisor"}
)
@Role(2)
public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
    BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
    advisor.setTransactionAttributeSource(this.transactionAttributeSource());
    advisor.setAdvice(this.transactionInterceptor());
    advisor.setOrder((Integer)this.enableTx.getNumber("order"));
    return advisor;
}

@Bean
@Role(2)
public TransactionAttributeSource transactionAttributeSource() {
    return new AnnotationTransactionAttributeSource();
}

@Bean
@Role(2)
public TransactionInterceptor transactionInterceptor() {
    TransactionInterceptor interceptor = new TransactionInterceptor();
    interceptor.setTransactionAttributeSource(this.transactionAttributeSource());
    if (this.txManager != null) {
        interceptor.setTransactionManager(this.txManager);
    }

    return interceptor;
}

3. 解析流程

debug发现从

AbstractApplicationContext 开始进入
public void refresh() throws BeansException, IllegalStateException {
    Object var1 = this.startupShutdownMonitor;
    synchronized(this.startupShutdownMonitor) {
        this.prepareRefresh();
        ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
        this.prepareBeanFactory(beanFactory);

        try {
            this.postProcessBeanFactory(beanFactory);
            // 解析自动导入的类
            this.invokeBeanFactoryPostProcessors(beanFactory);
            this.registerBeanPostProcessors(beanFactory);
            this.initMessageSource();
            this.initApplicationEventMulticaster();
            this.onRefresh();
            this.registerListeners();
            this.finishBeanFactoryInitialization(beanFactory);
            this.finishRefresh();
PostProcessorRegistrationDelegate -->
invokeBeanDefinitionRegistryPostProcessors() --> 

解析的入口为ConfiguratuonClassPostProccessor的postProcessBeanDefinitionRegistry--> 

processConfigurationDefinitions方法

具体解析Import的类为ConfigurationClassParser

解析路径为process--> processGroupImports-->processImports --> proccessConfigurationClass --> doProcessConfigurationClass

4. 事务处理流程(多个数据源)

DataSourceTransactionManager类

1) 根据Service方法上的Transactional注解生成代理类,执行这个方法之前,先走代理逻辑,也就是事务逻辑

2) 第一步获取事务doGetTransaction

3) 第二步开始执行事务 doBegin, 这一步会将connection提交方式设置为手动提交

4)第三步 执行doCommit

5) 如果抛出异常,执行doRollback回滚

发布了210 篇原创文章 · 获赞 105 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u010627840/article/details/103708926
今日推荐