面试记录 2026-10-19
题目:Seata 的 4 种事务模式,各自适合的场景是什么?
难度:low
标签:arch/distributed/transaction, distributed/xa, distributed/seata, difficulty/low
评分:⭐⭐⭐☆☆(3/5)
我的回答
AT 模式是最常用的模式,依赖数据库的事务机制,无需业务侧做什么改动,来实现分布式事务的操作
TCC 需要代码入侵自己进行补偿提交相关的业务回滚
XA 模式是基于数据库自身的xa来实现的
saga 状态机事务补偿
点评
优点:
- 4 种模式名称全部正确:AT / TCC / XA / Saga
- AT 的"低侵入、依赖数据库"与 TCC 的"高侵入、业务补偿"抓得准
- Saga 点出了状态机与补偿
不足:
- 题目问的是"各自适合的场景",场景几乎没答——这是本题失分核心
- 未提 AT 的全局锁/undo_log,未提 XA 的阻塞,未提 Saga 的长链路特性
- 未给出选型依据(侵入性/一致性/性能/是否阻塞)
补充:
- AT:订单+库存+支付等常规微服务(低侵入、有全局锁)
- TCC:核心账务、跨库、需细粒度资源控制(侵入高、无全局锁)
- XA:单库多表/传统 JTA 场景(强一致但阻塞、性能低)
- Saga:长链路、多步业务流程(最终一致、需每步补偿)
完整讲解
第一部分:知识重点剖析
核心考点定位:不只考"有哪 4 种",而是考"每种模式的机制 + 适配场景 + 选型依据"。
知识点拆解:
- AT(Auto Transaction):代理 DataSource,一阶段写 before/after image + undo_log 并申请全局锁;二阶段成功异步删 undo_log,失败反向生成 SQL 回滚。低侵入,适合订单/库存等常规链路。
- TCC:业务实现 Try(冻结)/Confirm(提交)/Cancel(补偿)。侵入高、锁粒度细,适合核心账务、跨库、需要资源预留的场景。
- Saga:把长事务拆成多个本地事务,每步配补偿;靠状态机编排。适合长链路、可接受最终一致的业务。
- XA:基于数据库 XA/JTA 的两阶段提交,强一致但全程持锁、阻塞,适合单库多表或传统中间件场景。
- 选型矩阵:一致性强度 / 侵入性 / 性能 / 是否阻塞 / 事务时长。
第二部分:考察方向与延伸递进
考察方向:
- 深度:AT 的全局锁与 undo_log、TCC 三方法语义
- 广度:4 模式与 2PC/Saga/本地消息表的映射
- 应用:给定业务能否选出模式并说明理由
延伸递进面试题:
- "AT 和 TCC 都偏强一致,怎么选?"
- 要点:AT 低侵入但有全局锁;TCC 侵入高但锁粒度细、可控性强,核心账务选 TCC。
- "Saga 的补偿一定成功吗?"
- 要点:不保证,补偿本身要幂等 + 可重试 + 状态可查,失败进人工/对账。
- "XA 为什么生产上越来越少用?"
- 要点:全程持锁阻塞、性能差、对数据库和中间件要求高。
第三部分:面试者参考回答
【一句话结论】
面试官您好,Seata 有 AT、TCC、Saga、XA 四种模式,本质是在"侵入性、一致性、性能"之间做不同取舍。
【三点展开】
第一,AT 是默认首选,代理数据源 + undo_log 自动回滚,业务几乎不改,适合订单、库存这类常规微服务,代价是全局锁。
第二,TCC 要业务自己写 Try/Confirm/Cancel,侵入最大但资源控制最细,适合核心账务和跨库场景;Saga 则是长链路状态机编排,每步配补偿,适合多步、可接受最终一致的流程。
第三,XA 是数据库原生两阶段,强一致但全程持锁、阻塞、性能差,只在单库多表或传统 JTA 场景考虑。
【一句边界】
当然,模式选择看业务对一致性和侵入性的容忍度,不是越强越好——大多数互联网链路用 AT 或最终一致方案就够了。