Skip to content

刚性事务与柔性事务 ​

一句话结论 ​

  • 刚性事务,遵循 ACID 原则,具有强一致性。比如,数据库事务。

  • 柔性事务是根据不同的业务场景使用不同的方法实现最终一致性。即我们可以根据业务的特性做部分取舍,容忍一定时间内的数据不一致。

总结来讲,与刚性事务不同,柔性事务允许一定时间内,数据不一致,但要求最终一致。而柔性事务的最终一致性,遵循的是 BASE 理论。

一、本质:同一问题在 CAP 里的两条取舍路线 ​

分布式事务的方案空间,本质上是在 CAP 里选边(理论背景见 分布式理论-CAP原则):

  • 刚性事务选 C(强一致):宁可牺牲可用性与性能,也要任何时刻读到的数据一致;
  • 柔性事务选 A(可用)+ 分区容忍:接受短暂不一致,换取高并发下系统不锁死,靠补偿收敛到一致。

把 ACID 与 BASE 逐条对上,能看清"柔性"到底柔掉了什么:

ACID(刚性)含义BASE(柔性)对应取舍
Atomicity 原子性全成或全败,无中间态Soft state 软状态允许存在中间状态
Consistency 一致性事务前后约束不破坏Eventually consistent 最终一致中间态经过补偿/重试后收敛
Isolation 隔离性并发事务互相不可见(基本放弃)中间态对外可见,需业务容忍或屏蔽
Durability 持久性提交即永久生效同样要求两者共同的底线,不取舍

二、分界线:资源锁定与中间态 ​

维度刚性事务柔性事务
一致性强一致最终一致
资源占用两阶段间锁定资源、同步阻塞一阶段即提交本地事务,不长期锁资源
中间态对外不可见(靠隔离性保证)对外可见,需业务能容忍/屏蔽
性能低(量级差距)高
复杂度落点在数据库/中间件层,应用近乎零改造转移到业务层:补偿、幂等、对账都要自己写
典型故障形态阻塞、协调者单点、锁等待空回滚、悬挂、消息丢失、补偿失败
强一致 ◄──────────────────────────────────────► 最终一致
 2PC/XA    3PC     TCC    事务消息/本地消息表    Saga    最大努力通知
 |◄────── 刚性 ──────►| |◄──────────────── 柔性 ────────────────►|

三、典型方案归类 ​

  • 刚性:2PC/XA、3PC。数据库/中间件层实现,应用透明。其中 3PC 是理论改进,工程上很少直接落地。
  • 柔性:TCC、本地消息表、事务消息(RocketMQ)、Saga、最大努力通知。业务层实现,每种都有自己的补偿与幂等套路。

各方案的完整流程、优缺点与面试话术统一拆在同目录总纲 分布式事务解决方案 里。本篇不重复,只给一张归类速查:

方案阵营一句话特征
2PC/XA刚prepare 阶段锁资源,等协调者发令,强一致低性能
3PC刚加一轮询问+超时机制,缓解阻塞但仍有不一致窗口
TCC柔Try 预留资源、Confirm/Cancel 收尾,准强一致,业务侵入最大
本地消息表柔业务与消息同库同事务绑定,扫表重投兜底
事务消息柔half 消息 + 回查机制,去消息表,国内主流
Saga柔长事务拆本地事务链,失败反向补偿,无隔离性
最大努力通知柔衰减重试 N 次 + 对账兜底,一致性最弱

四、选型表 ​

判断条件结论
强一致是硬要求 + 并发低 + 单应用跨多库XA/2PC
资金/交易核心 + 高并发TCC
一般异步场景(下单后扣库存、发券)事务消息 / 本地消息表
流程长、参与方多、含第三方或遗留系统Saga
纯通知类,丢了可对账补最大努力通知
并发高的互联网业务(默认姿态)柔性事务,不用 XA

五、速记 ​

  • 刚性靠锁,柔性靠补:一个用资源锁定换一致,一个用补偿换吞吐。
  • 刚性的复杂度在中间件,柔性的复杂度在业务(Try/Confirm/Cancel、补偿服务、幂等键)。
  • 柔性三件套标配:幂等、重试、对账,缺一个都会在故障时翻车。
  • 允许不一致 ≠ 一直不一致:中间态的暴露时长要可控,且业务上有屏蔽手段(如"处理中"状态)。

延伸阅读:分布式事务解决方案(方案总纲)、分布式理论-CAP原则、分布式理论-BASE、什么是分布式事务?、全局事务与分支事务、分布式理论-2PC。

2026-10 扩充(原内容过薄)。