prontera / spring-cloud-rest-tcc

以Spring Cloud Netflix作为服务治理基础, 展示基于tcc思想所实现的分布式事务解决方案
2.58k stars 1.21k forks source link

部分Confirm的异常处理 #20

Closed zhoutianqi613 closed 7 years ago

zhoutianqi613 commented 7 years ago

楼主在confirm时,如果其中某项数据库操作(扣除余额或者消费产品) 发生异常,是如何统一全部回滚的???

prontera commented 7 years ago

您好,首先感谢对本项目的关注。在confirm的时候如果发生网络抖动或异常,此时TCC协调器会自动发起重试。如果该Confirm是第一个Participant的话,那么对于后面的Confirm是没有影响的,这里保持了一致性。如果是已有Confirm之后由其他Participant抛出异常的话,那么就属于Partial Confirm Exception,此时只能人工介入处理,所以你能看到有一个表记录了部分确认的情况。当然,要避免的这种情况,首先要保证代码质量,第二要保证其高可用。

zhoutianqi613 commented 7 years ago

ok,清楚明了。

prontera commented 7 years ago

如有更多问题欢迎新开issue。

RogerLuoXuan commented 6 years ago

部分confirm失败的case可以由控制器回滚所有的预留资源,也就是调用所有资源的cancel API即可,前提是comfirm和cancel对资源幂等 人工处理的前提一般是调用过程中服务中心down掉,此时comfirm/cancel均fallback,可以考虑用定时任务处理该情况,人工太肉

prontera commented 6 years ago

@RogerLuoXuan confirm是最终态,该状态没有回滚一说,若confirm状态存在回滚的可能,就是真正的不幂等。