mybatis-plus 配置多数据源推荐使用 dynamic-datasource-spring-boot-starter,通过 @ds 注解切换数据源;分布式事务需引入 atomikos 实现 xa 协调,确保跨库 acid。

MyBatis-Plus 配置多数据源本身不难,但要让多个数据库之间事务一致(即分布式事务),就得叠加事务协调机制。关键不是“能不能切数据源”,而是“切了之后改怎么保证ACID”。下面分两块说清楚:多数据源怎么配、分布式事务怎么兜住。
多数据源配置:用 dynamic-datasource 快速落地
推荐使用 dynamic-datasource-spring-boot-starter(MyBatis-Plus 官方生态组件),它把 AbstractRoutingDataSource + ThreadLocal + AOP 封装好了,不用手写路由逻辑。
- 加依赖(注意版本兼容性,2026年稳定用 3.5.2+):
- YAML 配置两个库(比如 master 写库、slave 读库):
spring:
datasource:
dynamic:
primary: master
strict: false
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/db_master
username: root
password: 123
slave:
url: jdbc:mysql://127.0.0.1:3306/db_slave
username: root
password: 123
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 在 Service 方法上用 @DS("slave") 或 @DS("master") 注解切换,支持嵌套调用(内部用栈式 ThreadLocal 实现);
- 默认走
primary配置的数据源,没加注解就自动用 master; - 支持分组(如
read组含多个从库)、spel 表达式动态选源(如@DS("#header.tenant"))。
分布式事务:XA + Atomikos 是最稳妥的落地方式
dynamic-datasource 本身不处理跨库事务,只负责路由。一旦一个方法里写了主库又读了从库(或操作了两个业务库),就必须引入外部事务管理器。主流方案是 JTA/XA,Spring Boot 推荐搭配 Atomikos。
- 加 JTA 支持依赖:
- 关闭原生 DataSource 自动配置(避免与 Atomikos 冲突):
spring:
autoconfigure:
exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
- 为每个数据源手动定义
XADatasourceBean,并注册到 Atomikos 的UserTransactionManager; - 配置
JtaTransactionManager替代默认的DataSourceTransactionManager; - Service 方法上加 @Transactional 即可——此时事务由 Atomikos 协调,能保证两个库要么都提交、要么都回滚。
注意事项与避坑点
实际落地时这几个细节容易出问题:
- XA 事务性能比本地事务低,只在真正需要强一致性的场景启用(如资金划转、订单+库存联动);读写分离类场景通常不需要分布式事务;
- MySQL 要开启 XA 支持:
SET GLOBAL innodb_support_xa = ON;(5.7+ 默认开启,但需确认); - 不要在同一个 @Transactional 方法里混用
@DS切换和非事务操作(如发消息、调 HTTP),否则事务边界混乱; - dynamic-datasource 的
@DS和 Spring@Transactional注解顺序有影响:建议@Transactional在外层,@DS在内层方法或 mapper 层; - 如果只是同库多表事务(比如分表后还在一个物理库),用 MyBatis-Plus 默认事务即可,无需 Atomikos。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










