Seata

一、Seata 是什么(先建立认知)

Seata =

👉 分布式事务解决方案(保证微服务数据一致性)


🧠 一句话理解:

Seata 用来解决:多个微服务操作多个数据库时,如何保证"要么都成功,要么都失败"。


🚨 二、为什么需要 Seata(真实问题)

单体事务:

复制代码
复制代码
@Transactional

✔ 一个数据库

✔ 一个服务

✔ 可以回滚


微服务事务:

复制代码
复制代码
订单服务
 ↓
库存服务
 ↓
支付服务

问题来了👇


❌ 失败场景

复制代码
复制代码
1️⃣ 创建订单成功
2️⃣ 扣库存成功
3️⃣ 支付失败 ❌

👉 数据不一致!!


❌ 后果:

  • 订单存在
  • 库存扣了
  • 钱没扣

👉 系统"脏数据"


🧠 三、Seata 目标

复制代码
复制代码
最终一致性

核心原则:

✔ 要么全部成功

✔ 要么全部回滚


🧱 四、Seata 架构(必须会画)

复制代码
复制代码
        TC(事务协调器)
               ↑
    ┌──────────┼──────────┐
    ↓          ↓          ↓
   TM         RM         RM
订单服务     库存服务   支付服务

🧠 五、三大核心角色(面试重点)


1️⃣ TC(Transaction Coordinator)

👉 事务协调者(Seata服务器)

负责:

  • 管理全局事务
  • 控制提交/回滚

2️⃣ TM(Transaction Manager)

👉 事务发起方

通常是:

复制代码
复制代码
订单服务

3️⃣ RM(Resource Manager)

👉 资源管理者

通常是:

复制代码
复制代码
库存 / 支付 / DB

🔄 六、Seata 执行流程(重点)

场景:下单流程

复制代码
复制代码
订单 + 扣库存 + 扣余额

🚀 Step 1:开启全局事务(TM)

复制代码
复制代码
订单服务 @GlobalTransactional

🚀 Step 2:注册全局事务

复制代码
复制代码
TM → TC:我开始事务

🚀 Step 3:执行本地事务

复制代码
复制代码
订单服务:插入订单
库存服务:扣库存
支付服务:扣余额

🚀 Step 4:记录 Undo Log(关键)

复制代码
复制代码
Seata 会记录修改前数据

👉 用于回滚


🚀 Step 5:成功提交

复制代码
复制代码
TC → 所有RM:commit

❌ Step 6:失败回滚

复制代码
复制代码
TC → 所有RM:rollback
↓
根据 undo log 回滚数据

🧠 七、Seata 三种模式(重点)


1️⃣ AT模式(最重要 ⭐⭐⭐⭐⭐)

👉 自动事务模式


特点:

  • 基于 SQL 级别
  • 自动生成 undo log
  • 无侵入(最常用)

执行过程:

复制代码
复制代码
1️⃣ 执行SQL
2️⃣ 记录before image
3️⃣ 提交 or 回滚

示例:

复制代码
复制代码
@GlobalTransactional
public void createOrder(){
    orderService.save();
    stockService.reduce();
}

优点:

  • 业务代码无侵入
  • 使用简单

缺点:

  • 性能开销
  • 依赖数据库

2️⃣ TCC模式(高级 ⭐⭐⭐⭐)

👉 Try / Confirm / Cancel


流程:

复制代码
复制代码
Try(预留资源)
Confirm(提交)
Cancel(释放)

例子:

复制代码
复制代码
扣库存:
Try → 预扣库存
Confirm → 真扣
Cancel → 释放

优点:

  • 性能高
  • 可控性强

缺点:

  • 代码侵入强
  • 开发复杂

3️⃣ Saga模式(长事务)


特点:

复制代码
复制代码
分布式长流程
每一步都有补偿动作

例子:

复制代码
复制代码
下单 → 支付 → 发货 → 通知
失败 → 逐步补偿

🔥 八、电商真实场景(重点)


下单流程:

复制代码
复制代码
订单服务(TM)
   ↓
库存服务(RM)
   ↓
支付服务(RM)
   ↓
优惠券服务(RM)

Seata保护:

复制代码
复制代码
任何一步失败 → 全部回滚

⚙️ 九、Spring Boot 集成 Seata


1️⃣ 依赖

复制代码
复制代码
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
</dependency>

2️⃣ 配置

复制代码
复制代码
seata:
  tx-service-group: my_tx_group
  registry:
    type: nacos

3️⃣ 开启全局事务

复制代码
复制代码
@GlobalTransactional(name = "create-order-tx")
public void createOrder(){
    orderService.save();
    stockService.reduce();
}

🧨 十、Seata vs 本地事务

对比 本地事务 Seata
范围 单库 多服务
一致性 强一致 最终一致
性能 中等
复杂度

🚨 十一、常见问题(面试必问)


❓ Seata如何保证一致性?

通过全局事务 + undo log + TC协调实现最终一致性。


❓ AT模式原理?

通过拦截SQL,记录数据变更前后的镜像,实现自动回滚。


❓ Seata性能问题?

因为需要记录 undo log 并进行全局协调,会有一定性能开销。


🧠 十二、面试标准回答(直接背)


❓ Seata是什么?

👉 答:

Seata 是一个分布式事务解决方案,用于解决微服务架构中跨服务、跨数据库的数据一致性问题。

它通过全局事务协调器 TC 管理事务状态,TM 发起事务,RM 执行本地事务,并结合 undo log 实现 AT 模式的自动回滚。


🚀 十三、你现在的微服务体系已经到这一步了

你现在已经掌握:

复制代码
复制代码
✔ Nacos(注册)
✔ Feign(调用)
✔ Gateway(鉴权+风控)
✔ Sentinel(限流熔断)
✔ Seata(事务一致性)

👉 这已经是 企业级微服务基础架构全套

相关推荐
swordbob3 小时前
Spring Cloud 5 大组件 · 单个服务开发顺序
后端·spring·spring cloud
Boop_wu3 小时前
[Spring Cloud] Nacos核心功能详解:从负载均衡到配置中心的全链路实践
spring·spring cloud·负载均衡
Wyc724093 小时前
Gateway
spring cloud
Boop_wu4 小时前
[Spring cloud] Nacos 介绍并配置环境
spring cloud
Boop_wu5 小时前
[Spring Cloud] 快速上手nacos
后端·spring·spring cloud
我登哥MVP5 小时前
SpringCloud Alibaba 核心组件解析:分布式事务(Seata)
java·spring boot·分布式·spring·spring cloud·java-ee·intellij-idea
椰椰椰耶20 小时前
[SpringCloud][14]OpenFeign参数传递方法
后端·spring·spring cloud
Boop_wu1 天前
[Spring cloud]微服务项目搭建(简易)
spring cloud
我登哥MVP1 天前
SpringCloud Alibaba 核心组件解析:服务注册与发现(Nacos)
java·spring boot·后端·spring·spring cloud·java-ee·maven