简述分布式事务解决方案第二篇——TCC协议

79 阅读3分钟

前言

在分布式系统中,事务的一致性、原子性和隔离性是一个巨大的挑战。为了解决这个问题,许多分布式事务解决方案应运而生。在前面我们也讲解了使用XA协议,但是XA需要数据库层面支持,数据库控制事务,而且XA协议也很少使用了,所以本文将继续讲解分布式事务的另一种解决方案TCC协议。

TCC协议概述

TCC协议全称是“Try-Confirm-Cancel”,它是一种基于补偿的分布式事务处理方案。TCC协议将一个分布式事务分为三个阶段:尝试(Try)、确认(Confirm)和取消(Cancel)。在分布式事务的执行过程中,每个子事务都会尝试执行,如果所有子事务都尝试成功,则分布式事务确认执行;如果有任何一个子事务尝试失败,则分布式事务取消执行。

TCC协议实现原理

TCC协议其实是业务层面实现控制事务,不考虑数据库是否支持XA,TCC协议的设计思想是将一个分布式事务分解为多个子事务,每个子事务都有一个对应的补偿操作。当子事务尝试执行时,会先执行对应的业务操作,并记录下业务操作的上下文信息。如果子事务执行成功,则直接提交;如果子事务执行失败,则根据记录的上下文信息进行补偿操作,以撤销已经执行的业务操作。通过这种方式,TCC协议能够保证分布式事务的一致性、原子性和隔离性。

image.png

具体步骤如下:

  1. Try操作:做业务检查以及资源预留。

  2. Confirm操作:做业务确认操作。

  3. Cancel操作:实现一个与try相反的操作即回滚。

TM首先发起所有分支事务的try操作,任何一个分支事务的try操作执行是失败,TM将会发起所有分支的cancel操作,若操作成功,TM会发起所有分支事务的confirm操作,其中conceal或者confirm失败,TM都会重试。 具体TCC实现代码如下:

public class Try {
  public void execute() {
    // 尝试执行所有子事务
    boolean allSubTransactionsSucceeded = executeSubTransactions();

    if (allSubTransactionsSucceeded) {
      // 如果所有子事务都执行成功,则进入Confirm阶段
      confirm();
    } else {
      // 否则,进入Cancel阶段
      cancel();
    }
  }

  private boolean executeSubTransactions() {
    // 尝试执行所有子事务,并返回是否所有子事务都执行成功的标志
    return true;
  }
}

优缺点

优点:

  1. 可靠性高:TCC协议能够保证分布式事务的一致性、原子性和隔离性,从而提高分布式事务的可靠性。

  2. 易于实现:TCC协议将一个分布式事务分解为多个子事务,每个子事务都有一个对应的补偿操作,实现起来相对简单。

  3. 灵活性高:TCC协议可以根据业务需求灵活地定义子事务和补偿操作,具有较强的扩展性。

缺点:

  1. 性能开销大:由于TCC协议需要记录业务操作的上下文信息并进行补偿操作,因此会有一定的性能开销。

  2. 实现复杂度高:虽然TCC协议将一个分布式事务分解为多个子事务,但是每个子事务都需要实现对应的补偿操作,实现起来相对复杂。

  3. 补偿操作可能失败:如果补偿操作失败,则会影响分布式事务的一致性,需要重试或者人工干预。