分布式事务是非常核心的分布式系统,也是大厂重点考察的内容,下面我就重点详解TCC分布式事务@mikechen
TCC分布式事务
TCC(Try-Confirm-Cancel,尝试-确认-取消),是一种常见的分布式事务解决方案,用于解决分布式系统中的事务一致性问题。
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面试题总结》