引入
atomikos
依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifactId> </dependency>
添加
TransactionManagerConfig
事务配置类@Configuration @EnableTransactionManagement public class TransactionManagerConfig { @Bean public UserTransaction userTransaction() throws SystemException { UserTransactionImp userTransactionImp = new UserTransactionImp(); userTransactionImp.setTransactionTimeout(30000); return userTransactionImp; } @Bean public TransactionManager atomikosTransactionManager(){ UserTransactionManager userTransactionManager = new UserTransactionManager(); userTransactionManager.setForceShutdown(false); return userTransactionManager; } @Bean @DependsOn({"userTransaction", "atomikosTransactionManager"}) public PlatformTransactionManager transactionManager() throws SystemException { return new JtaTransactionManager(userTransaction(), atomikosTransactionManager()); } }
由于
JTA
默认事务超时回滚时间为10秒,所以添加一个jta.properties
配置文件# 配置最大的事务活动个数,-1代表无限制 com.atomikos.icatch.max_actives= -1 # 默认超时时间,单位:毫秒 com.atomikos.icatch.default_jta_timeout= 30000 # 默认最大超时时间,单位:毫秒 com.atomikos.icatch.max_timeout= 60000
在
service
方法上添加DSTransactional
注解,千万不能用Transactional
注解否则会失效@PostConstruct @DSTransactional public void init() { List<SuperOrg> list = this.list(); if (CollectionUtil.isNotEmpty(list)) { for (SuperOrg superOrg : list) { this.init(superOrg.getId()); } } } private void init(Long orgId) { ThreadLocalContext.setOrg(String.valueOf(orgId)); codeService.init(orgId); deptService.init(); majorService.init(); classService.init(); authAccountService.initAccountId(orgId); }
好了这样我们就解决了动态切换数据源以及不同数据源带来的事务问题了。写这个还是踩了不少坑,用时二天半分析源码一步步测试才成功的。