← 每日面试题 学习看板

Seata的AT模式和XA有什么区别?

面试题/02架构设计题/02分布式/02分布式事务/Seata的AT模式和XA有什么区别?.md

完整讲解(权威版)

最后更新:2026-10-23 · 基于第 1 次作答

L1 · 30 秒速记

结论:XA 是数据库原生 2PC,锁持有到最终提交;AT 是 Seata 的业务层方案,一阶段业务即提交,靠 undo_log 补偿 + 全局锁保证一致性。 关键词:XA START/PREPARE/COMMIT · undo_log · 全局锁 · 业务无侵入 边界:AT 依赖数据库行锁与唯一索引,热点行与跨 RPC 场景不适用。

L2 · 核心讲解

核心考点定位:能否把 XA 与 AT 的差异讲成"锁持有时间 + 补偿方式 + 侵入性"三个维度,而不是只说"一个快一个慢"。

机制链(≥3 环):

  1. XA 一阶段 → 所有资源管理器执行并加锁但不提交:锁与连接在整个事务期间不释放。
  2. XA 二阶段 → 协调者通知提交或回滚:参与者执行真正的提交或反向操作。
  3. AT 一阶段 → 业务 SQL 通过 JDBC 代理执行,同时写 undo_log 并获取行级全局锁,本地事务立即提交:锁持有时间从"整个事务"缩短到"SQL 执行期间"。
  4. AT 二阶段 → 提交时异步清理 undo_log(几乎无成本),回滚时按 undo_log 反向 SQL 补偿:业务方不参与补偿。

证据锚点:

对比与权衡:

维度XAAT
一致性来源数据库原生 2PC全局锁 + undo_log 补偿
锁持有时间整个事务SQL 执行期间
吞吐低(长事务阻塞)高(一阶段即提交)
业务侵入需数据库支持并开启 XA引入依赖 + 配置 TC,代码不改
跨库兼容各库实现不一致依赖统一数据库行锁能力
适用单库多表、强一致微服务本地事务协调

常见误区:

  1. 错误:AT 的一致性比 XA 强 → 正确:XA 是数据库级强一致,AT 是最终一致 + 全局锁 → 为什么:AT 一阶段已提交,靠补偿回滚,存在补偿窗口。
  2. 错误:AT 不需要锁 → 正确:AT 需要行级全局锁做冲突检测 → 为什么:没有全局锁,两个全局事务可能同时修改同一行导致补偿失效。
  3. 错误:AT 可以替代所有事务场景 → 正确:跨 RPC、发消息、外部支付需要 TCC 或事务消息 → 为什么:AT 只能拦截数据库 SQL。

适用边界:AT 适合"多个微服务各自操作本地数据库"的协调;不适合热点行、跨 RPC 调用、异构数据库场景。

延伸追问(≥3)

  1. AT 的全局锁和普通行锁有什么区别?
  1. AT 为什么二阶段提交几乎无成本?
  1. AT 和 TCC 怎么选?

面试者参考回答(400–700 字)

【结论】 面试官您好,XA 是数据库原生的 2PC 实现,AT 是 Seata 在业务层对 2PC 的重新拆分,核心差异在锁持有时间、补偿方式和业务侵入性。

【三点】 第一,XA 完全依赖数据库自身能力。MySQL 提供 XA START、XA PREPARE、XA COMMIT 语法,一阶段所有资源管理器执行并加锁但不提交,二阶段协调者统一通知提交或回滚。它要求事务内保持同一个数据库连接,锁和连接在整个事务期间都不释放,所以吞吐低、长事务阻塞明显,而且不同数据库的 XA 实现不完全一致。第二,AT 是 Seata 自己实现的方案,需要业务库建一张 undo_log 表。业务 SQL 通过 JDBC 代理执行时,Seata 同时记录行级前后镜像到 undo_log,并获取 TC 侧的行级全局锁,然后本地事务立即提交。这样锁持有时间从"整个事务"缩短到"SQL 执行期间",吞吐明显优于 XA。第三,AT 的补偿不靠业务代码。提交时异步清理 undo_log,几乎无成本;回滚时按 undo_log 里的反向 SQL 把 after image 还原成 before image,业务方完全不用实现反向接口。XA 的回滚则要求参与者执行真正的反向操作。

【边界】 当然,AT 的一致性弱于 XA,它是最终一致加全局锁,不是数据库级强一致。AT 依赖数据库行锁和唯一索引,热点行场景全局锁竞争严重;跨 RPC 调用、发消息、调外部支付这些非事务资源 AT 覆盖不了,需要配合 TCC 或事务消息。所以实际落地通常是 AT 处理本地事务协调,TCC 处理核心账务,事务消息处理异步解耦。

面试记录 2026-10-23(第 1 次)

题目:Seata 的 AT 模式和 XA 有什么区别?

难度:low

标签:arch/distributed/transaction, distributed/xa, distributed/seata

评分:⭐⭐⭐☆☆(3/5)

练习次数:1

我的回答

Seata的XA模式是完全基于数据库自身的XA实现的,通过数据库的XA实现的,所有操作2PC的管控都是基于数据库自身的能力,需要数据库支持并且开启XA才能使用;

AT模式则不同,其依据的是Seata自身的业务实现,不过需要自建一个undo_log表用于存储分布式事务执行中的过程,如果最后执行成功了那么久删除对应的undo_log,如果事务执行失败了,则根据seata存储的undo_log进行回滚,这个undo_log并不是数据库层面的,而是seata自己业务实现的;

另外AT模式由于其执行过程先提交本地事务,后续再进行检查和回滚,并不会从事务开始就进行阻塞,而XA模式从执行开始提交给数据库的协调者自己执行情况后就开始阻塞,所以,AT模式的吞吐量要好于XA模式,但是XA模式的一致性更强,其一致性是基于数据库底层的XA实现的,是数据库层面实现的2PC

点评

评分:⭐⭐⭐☆☆(3/5)

优点:

不足:

补充:

完整讲解见上方「完整讲解(权威版)」