【关于分布式事务一致性】 📅 2026/7/5 8:49:45 “事务一致性”是数据库和分布式系统中最核心、也是最难的概念之一。在面试和实际架构设计中它通常是区分初级和中高级开发的“分水岭”。以下是对“事务一致性”的全面深度解析一、 什么是事务一致性在数据库事务的ACID特性中C 代表一致性Consistency。定义事务执行前后数据库必须从一个一致性状态变换到另一个一致性状态。通俗理解事务不能破坏数据库的业务规则和完整性约束。例子A转账给B 100元。A的余额减少100B的余额增加100。如果A扣了钱但B没加钱或者总金额变多了/变少了这就破坏了“一致性”。注意一致性是事务的目的而原子性A、隔离性I、持久性D是数据库为了保证一致性而提供的手段。二、 本地事务一致性 vs 分布式事务一致性1. 本地事务单库场景在单体架构或单数据库场景下保证一致性非常简单。实现方式利用数据库自身的事务机制如 MySQL 的 InnoDB 引擎配合代码中的Transactional注解。特点强一致性实现简单性能高。2. 分布式事务微服务/多库场景在微服务架构下一个业务操作如下单 - 扣库存 - 扣余额 - 加积分可能跨越多个服务和多个数据库。痛点本地事务无法跨库/跨服务。如果“扣库存”成功但“扣余额”失败数据就不一致了。目标保证跨服务、跨数据库操作的最终数据一致性。三、 分布式事务的核心理论基石在解决分布式事务前必须了解两大理论1. CAP 定理一个分布式系统最多只能同时满足以下三项中的两项C (Consistency) 一致性所有节点在同一时间的数据完全一致。A (Availability) 可用性服务一直可用且正常响应时间范围内。P (Partition tolerance) 分区容错性遇到网络分区故障时系统仍能继续运行。结论在分布式系统中P 是必须的网络总会出问题所以我们只能在CP强一致牺牲可用性和AP高可用牺牲强一致之间做选择。2. BASE 理论是对 CAP 中 AP 方案的延伸核心思想是即使无法做到强一致性但可以通过适当的方式实现最终一致性。BA (Basically Available) 基本可用系统出现故障时允许损失部分可用性如响应时间变长、降级页面。S (Soft state) 软状态允许系统中的数据存在中间状态且该状态不影响系统整体可用性。E (Eventually consistent) 最终一致性系统中的所有数据副本在经过一段时间的同步后最终能够达到一致的状态。四、 分布式事务的主流解决方案重点根据对一致性的要求强一致 vs 最终一致主流方案有以下几种1. 2PC / 3PC两阶段/三阶段提交—— 强一致性原理引入一个协调者Coordinator和多个参与者Participant。阶段一Prepare协调者问所有参与者“你们能提交吗” 参与者执行事务但不提交锁住资源返回 Yes/No。阶段二Commit/Rollback如果所有参与者都返回 Yes协调者下发 Commit 指令只要有一个返回 No就下发 Rollback 指令。缺点同步阻塞性能差、单点故障协调者挂了大家干瞪眼、数据不一致阶段二部分节点宕机。代表框架Seata 的AT 模式对 2PC 的改进通过解析 SQL 生成 undo_log 实现自动回滚无代码侵入。2. TCCTry-Confirm-Cancel—— 强/最终一致性原理业务层面的 2PC。将事务分为三个阶段全部由业务代码实现Try资源预留和业务检查如冻结账户 100 元但不实际扣除。Confirm真正执行业务如将冻结的 100 元实际扣除。要求幂等。Cancel取消执行释放资源如解冻那 100 元。要求幂等。优点无全局锁资源锁定粒度由业务控制性能比 2PC 好。缺点代码侵入性极强每个接口要写 3 个方法。面试必问TCC 的三大坑空回滚Try 没执行如网络超时直接收到了 Cancel。Cancel 需要识别出这是空回滚直接返回成功不能报错。悬挂Cancel 先于 Try 到达并执行了随后 Try 又到达并执行了导致资源被永久冻结。Try 需要检查是否已经执行过 Cancel如果是则拒绝执行。幂等性Confirm 和 Cancel 必须保证幂等因为网络抖动可能导致它们被重复调用。3. Saga长事务—— 最终一致性原理将一个长事务拆分为多个短小的本地事务。每个本地事务都有一个对应的补偿操作。正向执行T1 - T2 - T3。如果 T2 失败则执行 T1 的补偿操作 C1。注意不需要执行 T2 的补偿因为它没成功。优点适合业务流程长、跨越多个微服务的场景。缺点没有隔离性。在事务执行过程中其他事务可能会看到“中间状态”的数据脏读。4. 本地消息表 / MQ 事务消息 —— 最终一致性最常用这是互联网大厂最常用的方案用“最终一致性”换取“高可用性”。方案 A本地消息表传统方案在业务数据库中创建一张“消息表”。在同一个本地事务中执行业务操作如扣余额并往“消息表”插入一条消息。后台有一个定时任务/线程不断扫描“消息表”将消息发送到 MQ如 Kafka/RabbitMQ。下游服务消费 MQ 消息执行业务如加积分成功后通知上游删除消息表记录。缺点需要额外建表定时任务有延迟耦合了业务库。方案 BMQ 事务消息优雅方案如 RocketMQ生产者发送一条半消息Half Message到 MQ此时消费者不可见。MQ 返回半消息成功生产者执行本地事务如扣余额。根据本地事务结果向 MQ 发送 Commit提交或 Rollback回滚指令。如果 Commit消费者就能消费该消息并执行下游业务如加积分。如果生产者宕机没发 Commit/RollbackMQ 会回查本地事务状态。优点无需本地消息表解耦性能高。5. 最大努力通知 —— 最终一致性原理主要用于跨企业/跨系统的交互如微信支付回调。实现调用方在操作完成后尽最大努力通知接收方。如果接收方没响应调用方会按照阶梯时间如 15s, 30s, 1m, 2h…重试多次。同时提供对账接口接收方可以定时拉取数据进行核对和补偿。五、 方案对比与实战选型指南解决方案一致性类型性能代码侵入性适用场景代表框架/中间件2PC (Seata AT)强一致低低无侵入内部系统对一致性要求极高并发不高SeataTCC强/最终较高极高需写3个接口核心资金链路对性能和一致性要求都高Seata, HmilySaga最终高中业务流程长、参与方多、允许短暂不一致Seata, DTMMQ 事务消息最终最高低互联网高并发场景跨服务异步解耦RocketMQ本地消息表最终高中没有事务消息中间件或需要强依赖关系型数据库业务代码自研最大努力通知最终高低跨公司/跨系统的通知如支付回调、物流状态业务代码自研 架构师选型建议首选避免能通过业务设计避免分布式事务是最好的如将强关联的业务放在同一个库/同一个服务中。能用异步就用异步互联网 90% 的场景不需要强一致性。优先使用MQ 事务消息或本地消息表实现最终一致性。核心资金用 TCC/AT如果是金融、交易核心链路必须保证强一致再考虑使用 Seata 的 AT 或 TCC 模式。六、 面试避坑与加分项澄清概念面试官问“分布式事务怎么保证一致性”时不要只答强一致性。要明确指出分布式系统基于 BASE 理论通常追求的是最终一致性。Seata AT 模式的原理如果被问到 Seata一定要知道 AT 模式的核心是两阶段提交的演变全局锁undo_log回滚日志。它通过拦截 SQL在业务执行前记录“前镜像”执行后记录“后镜像”回滚时利用“前镜像”还原数据。结合“接口幂等”分布式事务尤其是 TCC、MQ 消费、重试机制中下游接口必须保证幂等性。你可以主动把“接口幂等”和“分布式事务”结合起来回答会极大增加面试官的好感。不要过度设计在面试中如果业务场景只是普通的电商下单直接回答“使用 RocketMQ 事务消息保证最终一致性”即可不要强行上 TCC会被认为“过度设计、不懂业务”。