返回

微服务时代如何玩转SpringCloud Alibaba Mybatis-Plus多数据源与Seata分布式事务融合的新世界

后端

利用 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 的无缝集成,简化了分布式事务的配置和管理。