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回滚