作者回复: TCC可以认为就是服务层的2PC,基本流程差不多。因为服务没有提交/回滚概念,所以用预留。 预留举个例子,对于酒店预留,可以在hotel表中添加一个状态字段,available表示可以预定,reserved表示预留了(还没有确认confirm),ordered表示已经预定了。TCC try的时候先设为reserved,这样别人就暂时不能定这个酒店了,confirm则改为ordered,如果cancel,则改为available状态。
作者回复: 这个要看具体的2PC实现和配置的策略。 像Seata这种2PC实现,第一个阶段其实已经本地提交,第二阶段的commit只是清除本地的undolog,可以异步去完成,即使commit失败,它也会重试。即使一直重试也不成功,也没有关系,记录错误日志,后面人工介入清除undolog即可。 根据标准的2PC规范,既然第一个阶段大家都返回Ready,表示可以提交了,那么第二个阶段应该而且必须要能提交成功,如果不成功就要告警人工介入修复。参考: https://stackoverflow.com/questions/171876/how-do-two-phase-commits-prevent-last-second-failure