概念

TCC 又称补偿事务。其核心思想是: " 针对每个操作都要注册一个与其对应的确认和补偿(撤销)操作 "。它分为三个操作:

Try 阶段:主要是对业务系统做检测及资源预留。

Confirm 阶段:确认执行业务操作。

Cancel 阶段:取消执行业务操作。

TCC 对应 TryConfirmCancel 三种操作可以理解成关系型数据库事务的三种操作:DML、Commit、Rollback。

在一个跨应用的业务操作中

Try:Try 操作是先把多个应用中的 业务资源预留 和 锁定,为后续的确认打下基础,类似的,DML 操作要锁定数据库记录行,持有数据库资源。

Confirm:Confirm 操作是在 Try 操作中涉及的所有应用均成功之后进行确认,使用预留的业务资源,和 Commit 类似。

Cancel:Cancel 则是当 Try 操作中涉及的所有应用没有全部成功,需要将已成功的应用进行取消(即 Rollback )。其中 Confirm 和 Cancel 操作是一对反向业务操作。

TCC 的具体原理如下:

从图中我们可以明显看到 Confirm 和 Cancel 操作是一对反向业务操作,即要 Try 返回成功执行 Confirm,要么 Try 返回失败执行 Cancel 操作。

分布式事务协调者:管理控制整个业务活动,包括记录维护 TCC 全局事务的事务状态和每个从业务服务的子事务状态,并在业务活动提交时确认所有的 TCC 型操作的 Confirm 操作,在业务活动取消时调用所有 TCC 型操作的 Cancel 操作。

举例

例子:A服务 转 30 块钱、B服务 转 50 块钱,一起到 C 服务上。

Try(尝试执行业务):完成所有业务检查,检查 A、B、C 的帐户状态是否正常,帐户A 的余额是否不少于 30 元,帐户B 的余额是否不少于 50 元。预留必须的业务资源(准隔离性):帐户A 的冻结金额增加 30 元,帐户B 的冻结金额增加 50 元,这样就保证不会出现其他并发进程扣减了这两个帐户的余额而导致在后续的真正转帐操作过程中,帐户 A 和 B 的可用余额不够的情况。

Confirm(确认执行业务):真正执行业务,如果 Try 阶段帐户 A、B、C 状态正常,且帐 A、B 余额够用,则执行 帐户给 账户C 转账 30 元、帐户B 账户C 转账 50 元的转帐操作。这时已经不需要做任何业务检查,Try 阶段已经完成了业务检查。只使用 Try 阶段预留的业务资源,即 Try 阶段 帐户A 和 帐户B 冻结的金额。

Cancel(取消执行业务):释放 Try 阶段预留的业务资源,如果 Try 阶段部分成功,比如 帐户A 的余额够用,且冻结相应金额成功,帐户B 的余额不够而冻结失败,则需要对 帐户A 做 Cancel 操作,将 帐户A 被冻结的金额解冻掉。

TCC 和 2PC 比较

2PC 是资源层面的分布式事务,强一致性,在两阶段提交的整个过程中,一直会持有资源的锁。

XA 事务中的两阶段提交内部过程是对开发者屏蔽的,事务管理器在两阶段提交过程中,从 prepare 到 commit/rollback 过程中,资源实际上一直都是被加锁的。如果有其他人需要更新这两条记录,那么就必须等待锁释放。

TCC 是业务层面的分布式事务,最终一致性,不会一直持有资源的锁。

当执行 Try 接口的时候,已经把所需的资源给预扣了,比如上面举例的 A服务 已经预扣 30 元,B服务 已经预扣 50 元,它是由 Try 接口实现,这样就保证不会出现其他并发进程扣减了这两个帐户的余额而导致在后续的真正转帐操作过程中,帐户 A 和 B 的可用余额不够的情况,同时保证不会一直锁住整个资源。

TCC中的两阶段提交并没有对开发者完全屏蔽,也就是说从代码层面,开发者是可以感受到两阶段提交的存在。

(1) Try 过程的本地事务,是保证资源预留的业务逻辑的正确性。

(2) Confirm/Cancel 执行的本地事务逻辑确认/取消预留资源,以保证最终一致性,也就是所谓的补偿型事务。

由于是多个独立的本地事务,因此不会对资源一直加锁。

原文:https://www.cnblogs.com/qdhxhz/p/11172585.html

分布式事务——TCC 原理相关推荐

  1. 分布式事务实现原理【BAT 面试题宝库附详尽答案解析】

    问题场景 什么是事务? 事务是数据库从一个稳定状态变迁到另一个稳定状态的保证,具备 ACID 这 4 个特性: 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结 ...

  2. 【BAT 面试题宝库附详尽答案解析】分布式事务实现原理

    问题场景 什么是事务? 事务是数据库从一个稳定状态变迁到另一个稳定状态的保证,具备 ACID 这 4 个特性: 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结 ...

  3. 分布式事务开山之作——《深入理解分布式事务:原理与实战》草图曝光!!

    大家好,我是冰河~~ 今天,咱们就暂时不聊[精通高并发系列]了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作--<深入理解分布式事务:原理与实战>一书 ...

  4. 来!带你深入理解分布式事务:原理与实战!

    随着互联网的不断发展,互联网企业的业务在飞速变化,推动着系统架构也在不断地发生变化.总体来说,系统架构大致经历了 单体应用架构→垂直应用架构→分布式架构→SOA架构→微服务架构的演变. 如今微服务技术 ...

  5. 拜托,面试别再问我 TCC 分布式事务的原理了…

    微服务因其高内聚.低耦合.高扩展.敏捷开发为很多企业所用,当然,没有任何一项技术是完美的.系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并操作多个数据库实现. 毫不夸张地说,分布式事务已 ...

  6. 分布式事务管理原理 TCC和LCN 分布式详解

    最近笔者在面试过程中发现,分布式的微服务开发越来越广泛了,越来越多的企业在面试时都需要有微服务的经验,那么在谈到微服务的过程中,很多的面试官都会问到一个问题:有没有接触过分布式事务管理?怎么实现分布式 ...

  7. 分布式事务Seata原理

    一.Seata 介绍: 1.Seata 简介: Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务,为用户提供了 AT.TCC.SAGA 和 XA 几种不同的事务模 ...

  8. 分布式事务TCC方案——Hmily金融级柔性分布式事务解决方案介绍

    关于TCC的理论部分请参考:分布式事务基础理论--TCC 概述 目前市面上的TCC框架众多(都是国内的呢): 框架名称 GitHub地址 tcc-transaction https://github. ...

  9. 分布式事务TCC使用手册

    1.pom.xml配置 <dependency>   <groupId>com.jinnjo.tx</groupId> <artifactId>spri ...

最新文章

  1. Codeforces Round #265 (Div. 1) C. Substitutes in Number dp
  2. php ci框架 模板输出,CI框架中使用通用模板引擎smarty
  3. c++ vector拷贝构造_vector------stl学习笔记一
  4. 取代java_为什么C++没有被java取代
  5. 数据结构-- 线性表之链式存储
  6. abap 添加alv上的工具栏的按钮_神器必会!“世界上最好的编辑器Source Insight”...
  7. activity 变成后台进程后被杀死_Android 后台运行白名单,优雅实现保活
  8. 开源资产管理系统_部署开源夜莺运维监控平台V3版本
  9. Reactor模型和Proactor模型:同步IO与异步IO
  10. 表单标签(HTML)
  11. String 类型ID 获取
  12. 【习题基础知识】输入与输出、简单循环(好多图贴上去好累...要看图的话我把word文档发给你)...
  13. Ubuntu 环境下SVN添加新项目
  14. JavaScript 游戏开发:手把手实现碰撞物理引擎
  15. Ruby 2.6 新特征介绍
  16. 取十六进制的后两位数、中间两位数,以及高位数
  17. Mapbox离线字体 glyphs
  18. c语言判断学生成绩等级用switch,switch语句判断学生成绩
  19. 放大倍数与增益dB换算
  20. ZEGO 2018上海音视频技术嘉年华 活动回顾PPT下载

热门文章

  1. socket中的nagle算法
  2. 【玩转cocos2d-x之十九】从CCObject看cocos2d-x的拷贝机制
  3. C++ COM编程之什么是接口
  4. docker,k8s学习笔记汇总
  5. 把左耳朵、史海峰等牛人引进饿了么,张雪峰是何许人也?
  6. [Kafka与Spark集成系列三] Spark编程模型
  7. 【城市沙龙】LiveVideoStack Meet|南京:互联网沙漠的音视频发展
  8. LiveVideoStackCon讲师热身分享 ( 十二 ) —— 微博短视频高并发架构
  9. 腾讯研发效率领先的秘密:高效率的工具
  10. Python并发之协程gevent基础(5)