当前位置: 首页 > ops >正文

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
    @Configuration
    public class TransactionManagerConfig {@Autowiredprivate 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);}
    }
    
  • 在服务中使用
    @Service
    public class MultiDataSourceService {@Autowiredprivate Db1Mapper db1Mapper;@Autowiredprivate Db2Mapper db2Mapper;// 使用db1数据源的事务@Transactional("db1TransactionManager")public void processJiaoyi() {db1Mapper.insertData();}// 使用db2数据源的事务@Transactional("db2TransactionManager")public void processClearing() {db2Mapper.updateData();}
    }
    

注意事项

  • 数据源切换与事务顺序:

    确保@DS注解与@Transactional在同一方法或调用链中,避免数据源切换与事务管理器不匹配。

http://www.xdnf.cn/news/12151.html

相关文章:

  • 基于LocalAI与cpolar技术协同的本地化AI模型部署与远程访问方案解析
  • 通过SAE实现企业应用的云上托管
  • CICD实战(一) -----Jenkins的下载与安装
  • 数据可视化大屏项目怎么做?捷码平台5步实施框架
  • 从零到一:Maven 快速入门教程
  • 从零开始的嵌入式学习day33
  • 肿瘤相关巨噬细胞(TAM)
  • 新成果:GaN基VCSEL动态物理模型开发
  • Arduino学习-按键灯
  • ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
  • 使用联邦多轨迹图神经网络(GNNs)结合稀缺数据预测婴儿脑连接|文献速递-深度学习医疗AI最新文献
  • MDK程序调试
  • 指针的使用——基本数据类型、数组、结构体
  • 持续热点!持久性有机污染物(POPs)研究思路
  • 【Go】3、Go语言进阶与依赖管理
  • 电商实践 基于token防止订单重复创建
  • SuperMap Iserver 重置密码
  • 电路图识图基础知识-自耦变压器降压启动电动机控制电路(十六)
  • ProfiNet 分布式 IO 在某污水处理厂的应用
  • vue:当前对象添加对应值
  • VMware VCSA 9.0 Install
  • AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用
  • DBSyncer:开源数据库同步利器,MySQL/Oracle/ES/SqlServer/PG/
  • 互联网大厂Java求职面试:AI与大模型技术在企业知识库中的深度应用
  • RocketMQ 5.0 可观测能力升级:Metrics 指标分析
  • 拷贝构造函数
  • Maven​​ 和 ​​Gradle​​ 依赖管理的详细说明及示例,涵盖核心概念、配置方法、常见问题解决和工具对比。
  • 最小硬件系统概念及其组成
  • 安卓后台常驻读取NFC
  • 知识蒸馏:从模型输出到深层理解