TCC 空回滚与悬挂处理:网络抖动导致 Try 未执行直接 Cancel?幂等控制防误操作!
做过分布式事务开发的同学肯定都遇到过这个问题:TCC 模式下的空回滚和悬挂问题。简单来说就是:Try 方法还没执行,Cancel 方法就来了;或者 Try 执行失败,但 Cancel 还是被调用了。这些异常场景处理不好,会导致数据不一致。 我之前就遇到过这样一个案例:用户下单时库存扣减服务超时,TC(事务协调器)认为 Try 失败,触发 Cancel 回滚。但由于网络抖动,库存服务实际已经扣减成功了,只是响应超时。结果 Cancel 方法又执行了一次"回滚",把已经扣减的库存又加回去了,导致库存数据错误。 今天我们就来聊聊 TCC 空回滚与悬挂的处理方案,让你的分布式事务更加健壮。 TCC 模式基础回顾 1. TCC 三阶段流程 TCC(Try-Confirm-Cancel)模式: 阶段一:Try(预留资源) - 锁定相关资源 - 检查业务可行性 - 如果不可行,直接失败,不进入后续阶段 阶段二:Confirm(确认执行) - 真正执行业务操作 - 确认使用预留的资源 - 失败会不断重试,直到成功 阶段三:Cancel(取消回滚) - 释放预留的资源 - 回滚业务操作 - 失败也会不断....