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(事务一致性)

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

相关推荐
Rain的Java大神之路4 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
需要8264 天前
MySQL 索引 B+ 树与“查询为什么变慢了
java·spring boot·spring·spring cloud·tomcat
需要8264 天前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
苏渡苇5 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
叶总没有会5 天前
Nacos—注册中心
spring cloud·微服务
苏渡苇6 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
叶总没有会6 天前
微服务--分布式基础
java·spring·spring cloud·微服务
孙启超7 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
行百里er8 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
砍材农夫9 天前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud