直接回答

Saga 中的事务操作(正向操作)是推进业务流程的一步本地事务,直接提交、改变系统状态;补偿操作则是该步的"语义撤销",在后续步骤失败时按逆序执行,把系统拉回业务上可接受的状态。关键区别:补偿不是数据库层面的回滚——正向操作早已提交、对其他事务可见,补偿只是一个新的正向事务,从业务语义上抵消之前的效果。

展开解析

举例:订单 Saga 中"扣库存"的补偿是"回补库存";"收款"的补偿不是删除流水,而是发起一笔退款。由此引出设计约束:一是并非所有操作都可补偿——已发的短信、已出库的实物只能尽量补救,尽量把不可补偿的步骤排在最后(可补偿→可重试→不可补偿的顺序);二是正向与补偿都要幂等,网络重试和重复触发是常态;三是补偿也可能失败,需持久化 Saga 状态机、定时重试,最终人工介入兜底;四是中间态暴露——正向已提交而补偿未执行期间数据不一致,可用"待确认"状态字段对用户屏蔽。追问:补偿与 TCC 的 Cancel 有何异同、如何测试补偿路径(故障注入)。