微服务时代如何玩转SpringCloud Alibaba Mybatis-Plus多数据源与Seata分布式事务融合的新世界
2022-11-19 07:10:45
利用 Seata 在 Spring Cloud Alibaba 中无缝集成 Mybatis-Plus 多数据源和分布式事务
集成步骤
1. 引入依赖
在你的 pom.xml 文件中,引入以下依赖项:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.RELEASE</version>
</dependency>
2. 配置数据源
在 application.yml 文件中,配置你的数据源,如下所示:
spring.datasource.primary.url=jdbc:mysql://localhost:3306/db1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
3. 配置 Seata
在 application.yml 文件中,配置 Seata,如下所示:
seata.tx-service-group=my_test_tx_group
fescar.service.vgroupMapping.my_test_tx_group=default
fescar.config.enableUndoLog=true
4. 创建 Undo_Log 表
创建一张名为 Undo_Log 的表,用于存储撤销日志:
CREATE TABLE undo_log (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
branch_id VARCHAR(128) NOT NULL,
xid VARCHAR(128) NOT NULL,
context BLOB NOT NULL,
rollback_info BLOB NOT NULL,
log_status INT NOT NULL,
log_created DATETIME NOT NULL,
log_modified DATETIME NOT NULL,
ext VARCHAR(1024),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5. 启用 Seata
在主应用程序类中,使用 @EnableSeata 启用 Seata:
@EnableSeata
public class SeataAutoConfiguration {
}
6. 使用 @GlobalTransactional 注解
在服务方法上添加 @GlobalTransactional 注解,以使其成为分布式事务的一部分:
@GlobalTransactional
public void transfer(Integer fromUserId, Integer toUserId, BigDecimal amount) {
// 业务逻辑
}
案例演示
1. 创建两个账户
INSERT INTO account (user_id, balance) VALUES (1, 100);
INSERT INTO account (user_id, balance) VALUES (2, 100);
2. 执行转账操作
调用 transfer() 方法,进行转账操作:
transfer(1, 2, 10);
3. 验证结果
查询 account 表,验证转账结果:
SELECT * FROM account;
结果:
+--------+---------+
| user_id | balance |
+--------+---------+
| 1 | 90 |
| 2 | 110 |
+--------+---------+
总结
通过集成 Seata,我们实现了分布式事务,确保了数据的一致性和完整性。@GlobalTransactional 注解的使用提供了对分布式事务的无缝抽象,使开发人员能够轻松地处理跨多个数据源的事务。
常见问题解答
1. Seata 的分布式事务原理是什么?
Seata 使用两阶段提交协议 (2PC),协调多个数据源上的事务。
2. 如何配置 Seata 的事务超时时间?
可以通过设置 seata.tx-service-group.timeoutMills 属性来配置超时时间。
3. 如何处理 Seata 中的并发冲突?
Seata 使用乐观锁机制来处理并发冲突,通过检查数据更新前的数据版本。
4. Undo_Log 表有什么作用?
Undo_Log 表存储了事务操作的回滚信息,用于在事务失败时进行回滚。
5. 在 Spring Cloud Alibaba 中使用 Seata 有什么优势?
Spring Cloud Alibaba 提供了与 Seata 的无缝集成,简化了分布式事务的配置和管理。