多数据源解决事务问题

  • 引入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);
    }
    

好了这样我们就解决了动态切换数据源以及不同数据源带来的事务问题了。写这个还是踩了不少坑,用时二天半分析源码一步步测试才成功的。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 18:02:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 18:02:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 18:02:01       87 阅读
  4. Python语言-面向对象

    2024-04-09 18:02:01       96 阅读

热门阅读

  1. 单例模式

    2024-04-09 18:02:01       40 阅读
  2. TLC3702双微功耗电压比较器

    2024-04-09 18:02:01       41 阅读
  3. 除了sql外还有那些查询语言

    2024-04-09 18:02:01       40 阅读
  4. C++:std命名空间及输入输出流

    2024-04-09 18:02:01       33 阅读
  5. 蓝桥杯——求和

    2024-04-09 18:02:01       35 阅读
  6. oracle回收表空间

    2024-04-09 18:02:01       34 阅读
  7. 不同于Oracle:SEQUENCE的区别

    2024-04-09 18:02:01       28 阅读
  8. 进入Docker容器内部的文件夹

    2024-04-09 18:02:01       38 阅读
  9. css设置主题变量

    2024-04-09 18:02:01       35 阅读
  10. PostCss:详尽指南之安装和使用

    2024-04-09 18:02:01       34 阅读
  11. iOS自定义初始化方法

    2024-04-09 18:02:01       30 阅读
  12. 在Windows系统上下载并安装MySQL的详细教程

    2024-04-09 18:02:01       35 阅读
  13. 本地文件转为MultipartFile,图片地址转MultipartFile

    2024-04-09 18:02:01       38 阅读
  14. 如何动态往Spring容器注册/移除bean?

    2024-04-09 18:02:01       35 阅读
  15. pe格式从入门到图形化显示(五)-RVA和FOA

    2024-04-09 18:02:01       36 阅读
  16. 记一个Unity的异常问题

    2024-04-09 18:02:01       37 阅读
  17. UVA10391 Compound Words 复合词 解题报告

    2024-04-09 18:02:01       29 阅读
  18. Python入门:轻松学习,编程不再难

    2024-04-09 18:02:01       36 阅读
  19. 云智前端面试题

    2024-04-09 18:02:01       32 阅读