TCC(Try-Confirm-Cancel)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【6月更文挑战第5天】

TCC(Try-Confirm-Cancel)是一种分布式事务解决方案,它通过将一个事务拆分成三个阶段来保证事务的一致性。以下是对TCC的详细介绍,包括其概念、实现原理、优缺点以及在分布式系统中的应用。

TCC概念

TCC是由Pat Helland于2007年在论文《Life beyond Distributed Transactions: an Apostate’s Opinion》中提出的,后来由Atomikos公司正式命名为Try-Confirm-Cancel并注册了商标[^3^]。TCC的核心思想是“针对每个操作都要注册一个与其对应的确认和补偿(撤销操作)”,它分为三个操作阶段:
image.png

  1. Try阶段:主要是对业务系统做检测及资源预留。
  2. Confirm阶段:确认执行业务操作。
  3. Cancel阶段:取消执行业务操作。

TCC实现原理

TCC协议将一个分布式事务分为三个阶段:

  1. Try阶段:在这个阶段,系统会完成所有业务检查(一致性),并预留必要的业务资源(准隔离性)。例如,在转账场景中,系统会检查账户余额是否充足,并冻结相应的金额[^1^][^3^]。

  2. Confirm阶段:如果Try阶段成功,系统将进入Confirm阶段,此时会真正执行业务操作,如实际进行资金转账。在这个阶段,不再进行业务检查,因为Try阶段已经完成了所有必要的检查[^1^][^3^]。

  3. Cancel阶段:如果Try阶段失败或在Confirm阶段遇到问题,系统将执行Cancel操作,释放Try阶段预留的资源,确保系统状态回滚到事务开始前的状态[^1^][^3^]。

TCC优缺点

优点

  • 灵活性:TCC允许应用自己定义数据库操作的粒度,这有助于降低锁冲突和提高吞吐量[^2^]。
  • 业务侵入性:TCC的操作在业务层,使得开发人员可以更灵活地处理事务。
  • 资源锁定粒度:TCC允许业务方灵活选择业务资源的锁定粒度,这有助于优化性能。

缺点

  • 开发成本:TCC要求业务逻辑的每个分支都需要实现Try、Confirm、Cancel三个操作,这增加了开发成本[^2^]。
  • 实现难度:需要根据不同的失败原因实现不同的回滚策略,这增加了实现的复杂性。
  • 幂等性要求:Confirm和Cancel接口必须实现幂等性,以确保在网络超时或异常情况下,重复调用不会导致不一致的问题[^3^]。

TCC在分布式系统中的应用

TCC适用于需要强隔离性、严格一致性要求的业务活动,尤其适用于执行时间较短的业务[^3^]。在实际应用中,TCC可以与消息队列MQ结合使用,通过异步解耦来实现系统的数据最终一致性[^2^]。

目录
相关文章
|
5月前
|
SQL API 数据库
Seata AT模式问题之抛出异常触发回滚如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题
477 6
|
5月前
事务提交后回调
事务提交后回调
33 2
|
5月前
|
JavaScript 前端开发
confirm()、setInterval()、setTimeout()
confirm()、setInterval()、setTimeout()
30 0
|
前端开发 测试技术 持续交付
gitHooks: commit-msg
gitHooks: commit-msg
162 0
|
Java Spring
Redisson BUG: Failed to submit a listener notification task. Event loop shut down?
Redisson BUG: Failed to submit a listener notification task. Event loop shut down?
1274 0
dtm分布式事务——saga事务超时多次触发
saga属于长事务,因此持续的时间跨度很大,可能是100ms到1天,因此saga没有默认的超时时间。dtm支持saga事务单独指定超时时间,到了超时时间,全局事务就会回滚。
458 0
|
物联网 Linux 开发者
Pthread_cancel 线程取消|学习笔记
快速学习 Pthread_cancel 线程取消