【分布式事务】Seata 组件介绍

本文介绍了分布式事务解决方案中的两阶段提交协议,重点讲解了2PC模型的工作原理,并以电商购买为例说明其应用。同时,对Seata这个开源项目及其关键角色如TC、TM和RM进行了概述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.分布式事务解决方案之两阶段提交协议

2PC,即两阶段提交协议(Two-Phase Commit),是分布式系统中保证事务原子性的一种经典算法

2PC的设计目的是确保分布式事务能够在所有参与者上都成功提交,或者在所有参与者上都回滚,从而保证数据的一致性。这个协议分为两个阶段:

  • 准备阶段(Prepare Phase):在这个阶段,事务管理器会询问所有的事务参与者是否准备好提交事务。每个参与者都会尝试预执行事务,并保留必要的资源,然后向事务管理器报告是否可以提交。
  • 提交阶段(Commit Phase):如果所有参与者都报告可以提交,事务管理器就会发出正式提交的指令,参与者完成事务的真正提交。如果有任何一个参与者报告无法提交,事务管理器将指示所有参与者回滚事务。

举例:假设你在一个电商网站上购买了一件商品,这个操作涉及到了订单系统、库存系统 2 个不同的服务。这 2 个服务需要协同工作来共同完成这个购买操作。在这个场景中,如果任何一个服务出现问题,比如库存不足或者订单超时,那么整个购买操作就应该被回滚,否则就会出现数据不一致的问题。

  1. 准备阶段:事务管理器向所有参与者发送 Prepare 消息,每个数据库参与者在本地执行事务,并写好本地的 Undo/Redo 日志,此时事务没有提交。(日志在二阶段进行使用:Undo 用于回滚,Redo 用于提交)
  2. 提交阶段:如果事务管理器收到了参与者的执行失败或者超时消息时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据事务管理器的指令执行提交或回滚操作,并释放事务处理过程中使用的资源。

成功:
在这里插入图片描述
失败:
在这里插入图片描述

2.Seata 简介(两阶段提交协议的演变)

官网地址:https://seata.apache.org/zh-cn/docs/user/quickstart/

3.Seata 术语

官网地址:https://seata.apache.org/zh-cn/docs/user/quickstart/
要了解 Seata,首先我们要了解一下 Seata 中几个代表了分布式事务处理中的关键角色及概念:

  • TC (Transaction Coordinator):事务协调者,负责维护全局和分支事务的状态,并驱动全局事务的提交或回滚。
  • TM (Transaction Manager):事务管理器(发起者,同时也是 RM 的一种),定义全局事务的范围,负责开始全局事务以及提交或回滚全局事务。
  • RM (Resource Manager):资源管理器(每个参与事务的微服务),管理分支事务处理的资源,与TC进行通信以注册分支事务和报告分支事务的状态,并负责驱动分支事务的提交或回滚。在Seata中,分支事务通常指的是本地事务,而分布式事务则是由多个分支事务共同组成的全局事务。

示例图
用户购买商品的业务逻辑。整个业务逻辑由 3 个微服务提供支持:

  • 仓储服务:对给定的商品扣除仓储数量。
  • 订单服务:根据采购需求创建订单。
  • 帐户服务:从用户帐户中扣除余额。
    在这里插入图片描述

在这里插入图片描述

### 谷粒商城项目中的分布式事务 Seata 实现方案 #### 1. 分布式事务背景 在谷粒商城这样的复杂电商系统中,订单创建、库存扣减以及支付确认等多个操作通常分布在不同的微服务上完成。由于这些操作涉及多个数据库实例,传统的本地事务无法满足需求,因此需要引入分布式事务管理工具来保障数据一致性。 Seata 提供了一种高效的分布式事务解决方案,支持多种事务模式(AT、TCC、SAGA 和 XA),其中最常用的是 **AT 模式**,因为它无需额外编写补偿逻辑即可自动处理事务回滚和提交[^1]。 --- #### 2. 使用 Seata 的核心组件 为了实现分布式事务,在谷粒商城项目中可以采用以下架构设计: - **TM (Transaction Manager)**:负责协调全局事务的生命周期。 - **RM (Resource Manager)**:管理具体的数据资源(如 MySQL 数据库连接)并注册到 TM 中。 - **TC (Transaction Coordinator)**:作为独立的服务端,存储全局事务的状态信息并驱动事务的提交或回滚。 通过配置上述三个角色,可以在不同微服务之间同步执行事务操作。 --- #### 3. 配置步骤 以下是基于 Spring Cloud Alibaba 的 Seata 集成流程: ##### (1)引入依赖 在 `pom.xml` 文件中添加必要的 Maven 依赖项: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency> <!-- 如果使用 MySQL --> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </dependency> ``` ##### (2)修改数据库表结构 对于参与分布式事务的模块,需初始化 Seata 所需的 Undo Log 表。可以通过运行官方脚本文件生成该表结构。 ##### (3)配置文件调整 编辑 `application.yml` 或者 `application.properties` 来指定 TC 地址和服务名称: ```yaml seata: enabled: true tx-service-group: my_test_tx_group # 定义事务组名 service: vgroup-mapping: my_test_tx_group: default # 映射至默认集群 grouplist: default: 127.0.0.1:8091 # 设置 TC Server IP 及端口 ``` ##### (4)启用 @GlobalTransactional 注解 在关键业务方法上标注此注解以开启全局事务控制功能。例如: ```java @Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private StockFeignClient stockFeignClient; /** * 创建订单的同时减少商品库存 */ @GlobalTransactional(name = "create-order", rollbackFor = Exception.class) public void createOrder(Order order) { try { // 插入新订单记录 orderMapper.insert(order); // 远程调用通知库存服务扣除对应数量 stockFeignClient.decreaseStock(order.getProductId(), order.getCount()); } catch (Exception e) { throw new RuntimeException("订单创建失败:" + e.getMessage()); } } } ``` 以上代码片段展示了如何利用 Feign 客户端跨服务通信,并借助 Seata 自动化地维护两阶段提交过程。 --- #### 4. 常见问题排查 如果遇到异常情况,可以从以下几个方面入手分析原因: - 网络连通性测试:确保各 RM 正常访问到 TC; - 日志级别设置为 DEBUG 查看详细报错提示; - 检查分支事务是否成功向 TC 上报状态更新消息。 --- ### 示例总结 综上所述,Seata 在谷粒商城项目的实际落地过程中主要围绕着简化开发人员的工作量展开工作——即屏蔽底层复杂的协议交互细节,仅需关注业务逻辑本身即可达成一致性的目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值