阿里巴巴开源的 分布式事务解决方案Seata

发布于:2025-06-21 ⋅ 阅读:(24) ⋅ 点赞:(0)

Seata 是阿里巴巴开源的 分布式事务解决方案,全称是 Simple Extensible Autonomous Transaction Architecture。Seata 的目标是提供一个 高性能且易于使用的分布式事务服务,来解决微服务架构中最常见、最头疼的问题之一:分布式事务一致性问题


一、为什么需要 Seata?

在微服务架构中,一个业务操作通常会涉及到多个服务,比如一个电商下单流程可能会调用:

  • 订单服务
  • 库存服务
  • 账户服务

这些服务背后分别使用不同的数据库或存储系统,传统的数据库事务(如 JDBC 本地事务)无法跨数据库生效。这时候如果某一步失败,其它服务就可能出现数据不一致,造成严重问题。

于是需要一种机制来协调多个服务或数据库中的事务操作,这就是“分布式事务”。


二、Seata 能解决什么问题?

Seata 提供了完整的分布式事务解决方案,具有以下特点:

特性 说明
支持多种事务模式 包括 AT、TCC、SAGA、XA
事务隔离性强 尽量保证 ACID
高性能 基于异步处理和事务日志
服务自动注册/发现 支持注册中心(如 Nacos、Eureka)
Spring Cloud / Dubbo / gRPC 支持 与主流 RPC 框架集成
支持多种数据库 MySQL、Oracle、PostgreSQL 等

三、Seata 架构解析(重点)

Seata 架构主要由三个核心角色组成:

 ┌───────────┐        ┌───────────────┐        ┌───────────┐
 │           │        │               │        │           │
 │  RM(资源管理器)│<------>│ TC(事务协调者) │<------>│ TM(事务管理器)│
 │           │        │               │        │           │
 └───────────┘        └───────────────┘        └───────────┘

1. TM(Transaction Manager,事务管理器)

  • 负责开启全局事务,提交或回滚全局事务。
  • 由业务系统发起。
  • 使用 @GlobalTransactional 注解标注分布式事务的入口。

2. TC(Transaction Coordinator,事务协调器)

  • 核心组件。
  • 维护全局事务的状态。
  • 负责协调各 RM 的提交/回滚操作。
  • 相当于“分布式事务调度中心”,是一个独立部署的服务。

3. RM(Resource Manager,资源管理器)

  • 管理分支事务的资源(如数据库连接、SQL 等)。
  • 把事务状态通知 TC。
  • 在 TC 发出命令时执行 本地提交或回滚

四、事务流程详解(以 AT 模式为例)

AT 模式(Automatic Transaction)是 Seata 最主流也最简单的事务模式,适用于关系型数据库 + 业务无强逻辑依赖的场景。

1. 开启全局事务(由 TM 发起)

@GlobalTransactional
public void placeOrder() {
    orderService.createOrder();
    stockService.deductStock();
    accountService.deductMoney();
}

TM 向 TC 发起全局事务创建请求。


2. 各服务执行本地业务逻辑(由 RM 管理)

比如订单服务执行:

insert into orders ...

此时 RM 拦截 SQL,自动生成:

  • 前镜像(Before Image):更新前的数据快照
  • 后镜像(After Image):更新后的数据快照
  • 并记录到 undo_log 表中,保证可以回滚

3. 全局事务提交或回滚

  • 如果所有服务调用成功,TM 通知 TC 执行“全局提交”

    • TC 通知各 RM 提交本地事务
    • RM 删除 undo_log
  • 如果中间某个服务失败或抛出异常,TM 通知 TC 执行“全局回滚”

    • TC 通知各 RM 回滚本地事务
    • RM 利用 undo_log 中的前镜像还原数据

五、事务模式比较

模式 说明 适用场景
AT 自动事务,拦截 SQL,生成 undo_log 强一致性、关系型数据库
TCC Try-Confirm-Cancel 手动编排 业务强逻辑控制、幂等性要求高
SAGA 有状态长事务,定义补偿逻辑 异步解耦场景、柔性事务
XA 标准的两阶段提交协议 高一致性要求、数据库支持 XA

六、AT 模式示意图

用户请求
   ↓
TM(开启全局事务)
   ↓
业务调用A  → RM拦截SQL并生成undo_log
   ↓
业务调用B  → RM拦截SQL并生成undo_log
   ↓
业务调用C  → RM拦截SQL并生成undo_log
   ↓
TM 提交 or 回滚
   ↓
TC 通知各 RM 提交/回滚
   ↓
RM 提交或根据 undo_log 回滚数据

七、使用示例(Spring Cloud + Seata)

1. 引入依赖

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.7.0</version>
</dependency>

2. 配置文件(application.yml)

seata:
  enabled: true
  tx-service-group: my_tx_group
  service:
    vgroup-mapping:
      my_tx_group: default
  registry:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848

3. 启用分布式事务

@GlobalTransactional
public void createOrder() {
    orderService.create();
    storageService.deduct();
    accountService.debit();
}

八、undo_log 表

Seata 会为每个参与分支自动记录一张 undo_log 表,格式如下:

| id | branch_id | xid | context | rollback_info | log_status |

这是 AT 模式中最关键的本地回滚机制支撑,确保即便某服务异常也可恢复数据。


九、Seata 与其他解决方案对比

方案 特点
Seata(AT 模式) 自动化强、开发简单、侵入低、适合小中型分布式系统
TCC 手动控制,适合需要幂等、校验、复杂回滚逻辑
MQ事务(RocketMQ事务消息) 最终一致性,适合异步操作
本地消息表 + 补偿 灵活性强但开发复杂,适合企业定制场景

十、总结

维度 说明
使用简单性 ⭐⭐⭐⭐⭐(@GlobalTransactional 即可)
扩展性 ⭐⭐⭐⭐(支持多种事务模式)
性能 ⭐⭐⭐⭐(异步化、压缩 undo_log)
场景适配度 ⭐⭐⭐⭐⭐(适配大部分微服务)
依赖性 需部署 TC Server,数据库需支持 undo_log 表

如果你需要:

  • 快速实现微服务分布式事务
  • 不希望侵入业务代码
  • 希望控制性能与一致性的权衡

那么 Seata AT 模式 是当前 Java 生态下非常值得使用的方案。


网站公告

今日签到

点亮在社区的每一天
去签到