TCC分布式事务最全详解(图文全面总结)

TCC分布式事务最全详解(图文全面总结)

分布式事务是非常核心的分布式系统,也是大厂重点考察的内容,下面我就重点详解TCC分布式事务@mikechen

TCC分布式事务

TCC(Try-Confirm-Cancel,尝试-确认-取消),是一种常见的分布式事务解决方案,用于解决分布式系统中的事务一致性问题。

 

TCC分布式事务实现原理

TCC事务主要分为三个阶段,如下图所示:

TCC分布式事务最全详解(图文全面总结)

1:尝试Try阶段

在TCC(Try-Confirm-Cancel)分布式事务模式中,第一步是尝试(Try)阶段。

这个阶段是整个TCC事务的起点,主要目的是尝试执行事务的各个参与者(服务)的操作,并预留必要的资源,为后续确认(Confirm)、或取消(Cancel)做准备。

在尝试阶段,需要记录事务的当前状态、和各个参与者的执行结果。

这些记录通常用于后续的确认、或取消决策,以便根据实际情况选择提交、或回滚事务。

public boolean tryTransfer(String fromAccount, String toAccount, BigDecimal amount) {
    // 1. 扣减账户A的金额(假设调用扣减接口)
    boolean debitResult = accountService.debit(fromAccount, amount);
    // 2. 增加账户B的金额(假设调用增加接口)
    boolean creditResult = accountService.credit(toAccount, amount);
    
    // 返回尝试阶段是否成功
    return debitResult && creditResult;
}

 

2:确认Confirm阶段

在TCC(Try-Confirm-Cancel)分布式事务模式中,第二步是确认(Confirm)阶段。

只有在尝试阶段的所有事务参与者成功执行并且准备就绪时,才会进入确认阶段。

确认阶段用于:确认并执行之前在尝试(Try)阶段预留的操作,将事务的最终执行结果提交。

在确认阶段,会更新事务的状态,标记事务已经成功执行并提交。

这些状态的更新通常会记录在事务管理器、或者相关的事务日志中,以便后续的监控和恢复操作。

public void confirmTransfer(String fromAccount, String toAccount, BigDecimal amount) {
    // 实际执行转账操作(扣减账户A,增加账户B)
    transferService.transfer(fromAccount, toAccount, amount);
}

 

3:取消Cancel阶段

在TCC(Try-Confirm-Cancel)分布式事务模式中,第三步是取消(Cancel)阶段。

取消(Cancel)阶段适用于:在尝试阶段中出现了任何失败、或异常情况,需要撤销之前预留操作的业务场景。

在取消阶段,系统会执行与尝试阶段相反的操作,回滚所有在尝试阶段预留的操作。

例如:如果在尝试阶段对数据库中的记录进行了更新,那么在取消阶段就会执行回滚操作将记录恢复到事务开始前的状态。

在取消阶段,会更新事务的状态,标记事务已经被取消或者回滚。

这些状态的更新通常会记录在事务管理器、或者相关的事务日志中,以便后续的监控和恢复操作。

public void cancelTransfer(String fromAccount, String toAccount, BigDecimal amount) {
    // 回滚账户A的扣减操作
    accountService.rollbackDebit(fromAccount, amount);
    // 回滚账户B的增加操作
    accountService.rollbackCredit(toAccount, amount);
}

 

TCC应用场景

典型的应用场景,包括:金融交易的异常处理、订单处理中的库存回滚、复杂业务流程中的事务撤销…等场景。

金融交易:如转账、支付等操作,需要保证资金的安全性和一致性。

订单处理:包括:创建订单、扣减库存、支付…等多个步骤,需要确保订单状态的一致性。

业务流程:如审批流程、工作流……等,涉及多个步骤的业务操作。

优点

  • 灵活性和控制性:每个阶段的实现可以根据具体业务需求定制;
  • 高可用性:相比于2PC,TCC更容易处理部分参与者故障的情况。

缺点

  • 实现复杂度:需要开发人员显式地设计和实现每个阶段的业务逻辑,对业务入侵太大。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    暂无讨论,说说你的看法吧