SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题

情景

  • Springboot项目中使用dynamic配置了多个数据源;
  • primary(主要)数据源是oracle;
  • 其他数据源有postgres;
  • 想要在非primary数据源中使用@Transactional进行事务管理;
  • 在这之前没有单独配置Transactional事务的bean。

出现的问题

  • 非primary数据源中事务的sql检查报错

原因

使用primary数据源的数据库(oracle)方言去检查非primary数据源的数据库(Postgresql)的sql语句,出现sql语法不兼容的情况;

解决方法:

如果使用了springboot dynamic 多数据源配置时,primary数据源和其他数据原的数据库类型不一致,但是还想要在非primary数据源中使用@Transactional事务

  • 使用自定义的transactionManager

    java 复制代码
    @Configuration
    public class TransactionManagerConfig {
    
        @Autowired
        private DataSource dataSource; // 动态数据源
    
        @Bean("db1TransactionManager")
        public DataSourceTransactionManager jiaoyiTransactionManager() {
            DynamicRoutingDataSource dynamicDataSource = (DynamicRoutingDataSource) dataSource;
            DataSource jiaoyiDataSource = dynamicDataSource.getDataSource("db1");
            return new DataSourceTransactionManager(jiaoyiDataSource);
        }
    
        @Bean("db2TransactionManager")
        public DataSourceTransactionManager clearingTransactionManager() {
            DynamicRoutingDataSource dynamicDataSource = (DynamicRoutingDataSource) dataSource;
            DataSource clearingDataSource = dynamicDataSource.getDataSource("db2");
            return new DataSourceTransactionManager(clearingDataSource);
        }
    }
  • 在服务中使用

    java 复制代码
    @Service
    public class MultiDataSourceService {
    
        @Autowired
        private Db1Mapper db1Mapper;
    
        @Autowired
        private Db2Mapper db2Mapper;
    
        // 使用db1数据源的事务
        @Transactional("db1TransactionManager")
        public void processJiaoyi() {
            db1Mapper.insertData();
        }
    
        // 使用db2数据源的事务
        @Transactional("db2TransactionManager")
        public void processClearing() {
            db2Mapper.updateData();
        }
    }

注意事项

  • 数据源切换与事务顺序: 确保@DS注解与@Transactional在同一方法或调用链中,避免数据源切换与事务管理器不匹配。
相关推荐
撩得Android一次心动2 分钟前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
组合缺一6 分钟前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
MSTcheng.10 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11
一 乐14 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
KIKIiiiiiiii15 分钟前
微信个人号API二次开发中的解决经验
java·人工智能·python·微信
80530单词突击赢16 分钟前
SpringBoot整合SpringMVC全解析
java·spring boot·后端
vx1_Biye_Design26 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design27 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
qq5_81151751529 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
hdsoft_huge32 分钟前
1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
vue.js·spring boot·后端