分布式事物-TCC

什么是TCC

TCC(Try-Confirm-Cancel)的概念,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。

TCC 是应用端的二阶段编程模型,其 Try、Confirm、Cancel 3 个方法均由业务编码实现:

  • Try 操作作为一阶段,负责资源的检查和预留。
  • Confirm 操作作为二阶段提交操作,执行真正的业务。
  • Cancel 是预留资源的取消。

要使用 TCC-transaction 协议,您需要编写一个带有三个方法的接口:try、confirm、cancel。每个方法代表了事务在不同阶段应该进行的操作。在这种情况下, "try "方法用来尝试执行事务, "confirm"方法用来确认事务, "cancel"方法用来在失败情况下回滚(或撤销)事务。这意味着如果 "try "阶段的任何一部分失败,则 "cancel "方法将恢复 "try "方法已经执行的动作。

  1. 尝试(Try)阶段:这一步是执行事务的实际步骤。在这个阶段,会检查所有事务的前提条件和资源是否已经准备好(例如检查所有需要的资源已经正确初始化)。如果有任何错误或异常,TCC-transaction 协议将取消事务。如果所有的资源和前提条件都得到了满足,则可以开始执行事务所需的操作。

  2. 确认(Confirm)阶段:如果 "Try" 阶段成功并且资源被保留,那么接下来就会尝试提交事务。在这个阶段,就会执行实际的事务提交操作(例如将数据写入数据库),并将所有更改持久化。如果事务提交成功,那么 "Cancel "阶段就不会执行。否则,将执行 "Cancel "阶段。

  3. 取消(Cancel)阶段: 如果在 "Try "和 "Confirm "阶段之间发生错误(例如网络问题、资源不足、其他事务错误等),那么就需要执行 "Cancel "阶段以撤消 "Trying "阶段所做的所有操作。

在 Java 中,可以使用各种 TCC-transaction 实现库来实现以上描述的三种方法,例如 Alibaba 的 "tcc-transaction" 库。

TCC处理流程

Try阶段

TCC 机制中的 Try 仅是一个初步操作,它和后续的确认一起才能真正构成一个完整的业务逻辑,这个阶段主要完成:

  • 完成所有业务检查( 一致性 ) 。
  • 预留必须业务资源( 准隔离性 ) 。
  • Try 尝试执行业务。

TCC 事务机制以初步操作(Try)为中心的,确认操作(Confirm)和取消操作(Cancel)都是围绕初步操作(Try)而展开。

因此,Try 阶段中的操作,其保障性是最好的,即使失败,仍然有取消操作(Cancel)可以将其执行结果撤销。

以电商为例

用户下单涉及到

                   1.生成订单 (订单服务)

                   2.扣减库存(库存系统)

                   3.扣除积分(积分系统)

                   4.生成出库单(配送系统)

情况一没有出现任何异常的情况

try阶段

         1.开启事物

         2.创建订单

         2.根据业务单号冻结库存

         3.根据业务单号冻结积分

         4.生成出库单出库单号为待确认

 

Confirm阶段

根据try阶段的结果执行commit或者rollback

1.commit(没有任何异常)

        1.根据业务单号实际扣除库存(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)

        2..根据业务单号实际扣除积分(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)

        3.将出库单改为已确认((可能出现timeout 或者socketException 则重试直到成功 需要做幂等)

        4.提交事物

2.rollback(部分步骤失败 执行rollback)

        比如冻结积分返回积分不足,则回滚事物,根据业务单号执行取消冻结(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)

 

针对重试 如果下游服务器挂了 可能一直重试不成功,可以增加一些活动日志 后台定时补偿 保证最终一致性

 

tcc开源框架

ByteTCC,TCC-transaction,Himly。

缺点

TCC 的 Try、Confirm 和 Cancel 操作功能要按具体业务来实现,业务耦合度较高,提高了开发成本。

         

 

posted @ 2021-05-18 17:57  意犹未尽  阅读(192)  评论(0编辑  收藏  举报