面试知识库

MySQL 事务 → 分布式事务 → CAP 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. 单机ACID:redo log保证D(WAL先写日志再刷数据页),undo log保证A(回滚到修改前),MVCC+锁保证I
  2. CAP约束:网络分区(P)不可避免,CP牺牲可用性(超时拒绝服务),AP牺牲一致性(返回旧数据)
  3. 方案谱系:强一致 → 最终一致,一致性减弱、性能提升
    • 强一致:2PC/XA(阻塞,吞吐取决于锁持有时间和多轮RTT);Seata AT是2PC演进(自动补偿+全局锁),但一阶段就本地提交,属最终一致
    • 最终一致:TCC(侵入大,需预留) → SAGA(长事务) → 事务消息(推荐,解耦)
  4. 事务消息优势:天然异步解耦,无需额外消息表和扫表任务
  5. 代码示例:
    // RocketMQ事务消息生产者
    TransactionSendResult result = producer.sendMessageInTransaction(msg, null);
    // 本地事务监听器
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        try { orderService.createOrder(); return COMMIT_MESSAGE; }
        catch (Exception e) { return ROLLBACK_MESSAGE; }
    }
    java

面试回答串联#

30秒速答#

单机用MySQL的redo/undo/MVCC保证ACID。跨服务受CAP限制,强一致用2PC/XA(阻塞、性能差),Seata AT虽然有全局锁,但一阶段就本地提交,属于最终一致,最终一致推荐RocketMQ事务消息——半消息+本地事务+回查,兼顾性能和可靠性。

2分钟展开答#

MySQL单机事务的ACID通过四个机制保证:redo log用WAL策略保证持久性(先写日志再刷盘),undo log支持回滚保证原子性,MVCC通过ReadView+undo log版本链实现快照读保证隔离性,约束保证一致性。分布式场景下CAP定理限制了一致性和可用性不可兼得——分布式系统必须容忍网络分区,分区发生时只能在C和A之间取舍。强一致方案是2PC(XA协议,协调者单点+阻塞,性能差);Seata AT自动生成undo log,一阶段本地提交+二阶段异步清理,靠全局锁做写隔离,属最终一致。最终一致方案中TCC适合短事务有明确预留资源的场景(如库存冻结),SAGA适合长事务流程多的场景(如旅游订单多步骤)。我们项目中订单-库存-支付场景用RocketMQ事务消息:先发半消息(消费者不可见),再执行本地事务,成功commit消息,失败rollback,Broker还会定时回查未决消息。相比本地消息表方案(需要额外建表+扫表延迟),事务消息更轻量。

相关追问链#