分布式事务-TCC

TCC

Posted by lijian on September 24, 2019

简介

TCC(Try-Confirm-Cancel)分布式事务模型相对于 XA 等传统模型,其特征在于它不依赖资源管理器(RM)对分布式事务的支持,而是通过对业务逻辑的分解来实现分布式事务。

TCC 模型认为对于业务系统中一个特定的业务逻辑,其对外提供服务时,必须接受一些不确定性,即对业务逻辑初步操作的调用仅是一个临时性操作,调用它的主业务服务保留了后续的取消权。如果主业务服务认为全局事务应该回滚,它会要求取消之前的临时性操作,这就对应从业务服务的取消操作。而当主业务服务认为全局事务应该提交时,它会放弃之前临时性操作的取消权,这对应从业务服务的确认操作。每一个初步操作,最终都会被确认或取消

此,针对一个具体的业务服务,TCC 分布式事务模型需要业务系统提供三段业务逻辑:

初步操作 Try:完成所有业务检查,预留必须的业务资源。 确认操作 Confirm:真正执行的业务逻辑,不作任何业务检查,只使用 Try 阶段预留的业务资源。因此,只要 Try 操作成功,Confirm 必须能成功。另外,Confirm 操作需满足幂等性,保证一笔分布式事务有且只能成功一次。 取消操作 Cancel:释放 Try 阶段预留的业务资源。同样的,Cancel 操作也需要满足幂等性。

架构图

tcc.png

tcc02.png

流程

一个完整的 TCC 分布式事务流程如下:

主业务服务首先开启本地事务;

主业务服务向业务活动管理器申请启动分布式事务主业务活动;

然后针对要调用的从业务服务,主业务活动先向业务活动管理器注册从业务活动,然后调用从业务服务的 Try 接口;

当所有从业务服务的 Try 接口调用成功,主业务服务提交本地事务;若调用失败,主业务服务回滚本地事务;

若主业务服务提交本地事务,则 TCC 模型分别调用所有从业务服务的 Confirm 接口;若主业务服务回滚本地事务,则分别调用 Cancel 接口;

所有从业务服务的 Confirm 或 Cancel 操作完成后,全局事务结束。

注意

  • 注意事务日志,保存下来分布式事务运行的各个阶段和状态
  • 只要在try阶段成功了, confirm或cancel阶段会无限重试直到成功的

参考项目

基于可靠消息参考项目

最大努力通知参考项目

tcc 参考项目

巨人的肩膀

终于有人把“TCC分布式事务”实现原理讲明白了!

一篇文章带你学习分布式事务

分布式事务之TCC服务设计和实现注意事项