-
引入
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); }
好了这样我们就解决了动态切换数据源以及不同数据源带来的事务问题了。写这个还是踩了不少坑,用时二天半分析源码一步步测试才成功的。
本文介绍了如何在SpringBoot项目中引入Atomikos并配置事务管理,包括添加依赖、创建TransactionManagerConfig类、配置JTA超时时间以及使用DSTransactional注解处理不同数据源的事务问题。作者分享了实际开发中的坑点和解决过程。


被折叠的 条评论
为什么被折叠?



