【2022-12-26】TCC流程简单分析
参考链接:https://developer.aliyun.com/article/682871
1.TCC是什么
分布式事务的解决方案。TCC分别是Try、Confirm、Cancle的简称
-
Try阶段检查并预留资源
-
Confirm执行
-
Cancle取消
2.TCC架构
- 一个完整的业务活动由一个主业务服务与若干从业务服务组成(从业务服务就是我们需要保证事务一致的各个子服务)。
- 主业务服务负责发起并完成整个业务活动。
- 从业务服务提供TCC型业务操作。
- 业务活动管理器控制业务活动的一致性,它登记业务活动中的操作,并在业务活动提交时进行confirm操作,在业务活动取消时进行cancel操作
3.TCC阶段
TCC大致包含2个节点,1是Try,1是Confirm/Cancle
-
Try
-
完成所有必要业务检查
-
预留后续执行的业务资源
-
Confirm
-
只使用Try阶段预留资源、直接执行业务
-
重复Confirm须保证幂等
-
Cancle
-
释放Try阶段预留资源,使之回到最初的状态
-
重复Cancle须保证幂等
4.举个例子
例子:A和B同时向C转100,须保证同时成功,且A、B、C物理不在同一Mysql节点
-
Try
-
检查A账户资金足够100
-
锁定A账户100资金到冻结户
-
检查B账户资金足够100
-
锁定B账户100资金到冻结户
-
Confirm
-
Try阶段成功了,则依次执行将A和B冻结户转到C的操作(同时要确保重复执行Confirm幂等)
-
Cancle
-
Try阶段失败or Confirm期间A执行成功但是B执行失败了,则执行Cancle(同时要确保重复执行Cancle幂等)
5.TCC优缺点
-
优点
-
因为Try期间锁定了预留资源,因此Confirm一般都是会执行成功的
-
Try期间的资源锁定都是在业务代码中完成,不会blockDB
-
缺点
-
由于DB产生次数较多,因此性能有一定损耗,并且TCC整体事务时间被拉长
-
从业务服务越多,期间某一Confirm失败的可能性比较高,整体执行Cancle的概率比较大,处理时间也就比较长。(因为是执行失败一个,则会从头遍历执行Cancle方法,节点越多,要被执行的节点也就越多)
-
附一张内部执行的流程图
-
内部执行失败,会有定时任务补偿(在重试一定次数之内的未执行到终态的事务任务,会一直重试执行)