spring cloud seata 知识点
一、Seata 是什么?
Seata 是阿里巴巴开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
✅ 解决跨服务、跨数据库的事务一致性问题
✅ Spring Cloud Alibaba 官方推荐
二、分布式事务背景(为什么要用 Seata)
1️⃣ 传统事务的局限
- 单体应用:@Transactional ✅
- 微服务:多个服务、多个数据库 ❌
2️⃣ 典型问题
下单服务 → 扣库存 → 创建订单 → 扣账户余额❌ 其中一个失败,其他已提交 →数据不一致
三、Seata 核心概念(必背)
| 角色 | 说明 |
|---|---|
| TC (Transaction Coordinator) | 事务协调者(Seata Server) |
| TM (Transaction Manager) | 事务管理器(@GlobalTransactional) |
| RM (Resource Manager) | 资源管理器(数据库) |
四、Seata 执行流程(高频)
TM 开启全局事务 ↓ RM 注册分支事务 ↓ 执行业务 SQL ↓ RM 报告状态 ↓ TC 决定提交或回滚 ↓ TM 结束事务✅两阶段提交思想
五、Seata 的四种事务模式(重点)
1️⃣ AT 模式(最常用 ⭐⭐⭐⭐⭐)
特点
- 无侵入
- 自动补偿
- 基于 UNDO_LOG
原理
- 执行前:记录前镜像
- 执行后:记录后镜像
- 回滚:用前镜像恢复数据
✅适合大多数业务
2️⃣ TCC 模式(强一致)
| 阶段 | 方法 |
|---|---|
| Try | 资源预留 |
| Confirm | 确认 |
| Cancel | 取消 |
✅ 适合:
- 资金
- 库存
- 强一致场景
❌ 代码侵入高
3️⃣ SAGA 模式(长事务)
✅ 正向执行
✅ 失败补偿
✅ 适合:
- 跨系统
- 长流程
- 不可回滚操作
4️⃣ XA 模式(强一致)
✅ 数据库原生支持
❌ 锁时间长
六、AT 模式详解(面试必问)
1️⃣ UNDO_LOG 表(关键)
CREATETABLEundo_log(idBIGINTAUTO_INCREMENT,branch_idBIGINTNOTNULL,xidVARCHAR(100)NOTNULL,contextVARCHAR(128),rollback_infoLONGBLOB,log_statusINT,PRIMARYKEY(id));✅回滚的依据
2️⃣ 全局锁(Global Lock)
- 防止脏写
- 在提交前加锁
七、Seata 与 CAP 理论
| 模式 | 一致性 | 可用性 |
|---|---|---|
| AT | 最终一致 | ✅ |
| TCC | 强一致 | ❌ |
| SAGA | 最终一致 | ✅ |
八、Seata 配置要点(实战)
1️⃣ 引入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>2️⃣ 开启全局事务
@GlobalTransactionalpublicvoidcreateOrder(){orderService.create();accountService.debit();storageService.deduct();}3️⃣ 数据源代理(非常关键 ⚠️)
@BeanpublicDataSourcedataSource(DataSourceoriginal){returnnewDataSourceProxy(original);}❌ 不加代理 → Seata 不生效
九、Seata 常见问题(面试坑)
❌ 全局锁冲突
❌ 回滚失败
❌ UNDO_LOG 表缺失
❌ 数据源未代理
❌ 事务粒度过大
十、Seata vs 其他方案
| 方案 | 特点 |
|---|---|
| Seata AT | 简单、常用 |
| TCC | 强一致 |
| MQ 最终一致 | 高吞吐 |
| 2PC | 传统 |
十一、面试标准答案(背这段 ✅)
Seata 是阿里开源的分布式事务框架,通过 TC、TM、RM 三组件协调全局事务。
最常用的是 AT 模式,基于 UNDO_LOG 实现自动回滚,对业务侵入小。
对于强一致场景可使用 TCC 模式,对于长事务可使用 SAGA 模式。
在使用 Seata 时,必须对数据源进行代理,并配置全局事务注解。
十二、一句话总结(记住这句)
✅Seata = 分布式事务的“Spring @Transactional”
