MybatisPlus多数据源事务注解
时间: 2025-07-10 18:57:06 浏览: 4
### MyBatis Plus 中多数据源事务管理配置
在MyBatis Plus中实现多数据源的事务管理涉及几个重要方面,包括依赖添加、数据源配置、动态数据源切换机制以及事务注解的应用。
#### 1. 添加必要的Maven依赖
为了支持多数据源功能并处理事务,需引入如下依赖:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>x.x.x</version>
</dependency>
<!-- 动态数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>y.y.y</version>
</dependency>
```
上述代码展示了所需的核心依赖项[^1]。
#### 2. 数据源配置
定义多个`DataSource`实例,并指定主次关系。通常情况下会有一个默认的数据源作为主库,其他则为辅库或只读副本。可以在application.yml文件内完成此设置:
```yaml
spring:
datasource:
dynamic:
primary: master # 设置默认数据源名称为主库
strict: false # 是否严格匹配数据源,默认false表示如果找不到对应的数据源,则使用默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3307/slave_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
```
这段YAML片段说明了如何声明两个不同的MySQL数据库连接字符串及其凭证信息。
#### 3. 启用事务管理和动态数据源切换
对于跨多个数据源执行的操作,应当确保这些操作被包裹在一个全局事务之中;而对于特定于某个数据源的任务,则可以通过传播行为控制其独立性。下面是一个具体的例子展示如何做到这一点:
```java
@Service
@AllArgsConstructor
public class OrderService {
private final OrderMasterMapper orderMasterMapper;
private final OrderDetailMapper orderDetailMapper;
/**
* 主方法开启新事务
*/
@Transactional(rollbackFor = Exception.class)
public void createOrder(OrderDTO orderDTO) {
// 插入订单主表记录到master数据源
insertIntoMaster(orderDTO);
try {
// 尝试向slave数据源插入详情记录
insertIntoSlave(orderDTO);
} catch (Exception e) {
throw new RuntimeException("创建订单失败", e);
}
}
/**
* 新建子事务用于单独操作slave数据源
*/
@DS("slave")
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
protected void insertIntoSlave(OrderDTO orderDTO) {
OrderDetail detail = buildOrderDetailFromDto(orderDTO);
orderDetailMapper.insert(detail);
}
/**
* 默认操作master数据源
*/
@Transactional(propagation = Propagation.SUPPORTS)
protected void insertIntoMaster(OrderDTO orderDTO) {
OrderMaster masterRecord = buildOrderMasterFromDto(orderDTO);
orderMasterMapper.insert(masterRecord);
}
}
```
以上Java类示范了一个服务层接口的设计模式,其中包含了对不同数据源的具体调用逻辑[^4]。
阅读全文
相关推荐


















