TCC是支付宝提出的分布式事务解决方案,是 try、confirm、cancel 的缩写。

与2PC二阶段提交机制类似,区别在于层面不同,2PC是在数据库层面解决数据库之间的分布式事务,TCC是在应用层面解决分布式系统中的分布式事务。

工作流程

每个分布式事务的参与者都需要实现3个接口:try、confirm、cancel(confirm 对应2PC的事务提交,cancel 对应2PC的事务回滚)。例如一个转账业务,服务A负责扣钱、服务B负责加钱,A、B都要实现这3个接口。

TCC 分为2个阶段:

  1. 准备阶段

调用方调用各个服务的 try 接口,各个服务执行资源检查和锁定,看自己是否有能力完成,如果允许,则锁定资源。

  1. 提交阶段

如果各个服务的 try 接口都返回了 yes,则进入提交阶段,调用方调用各个服务的 confirm 接口,各个服务对 try 阶段锁定的资源进行处理。


如果 try 阶段有一方返回了 no,或者超时,调用方调用各个服务的 cancel 接口,释放锁定的资源。


对于异常情况,处理方法是不断重试,不管 confirm 失败了,还是 cancel 失败了,都不断重试。

流程示例

以转账为例,有2个服务,扣钱服务、加钱服务,都各自实现 try、confirm、cancel 接口。

现在账号 A 要给账号 B 转 30 元。

  • 阶段1:准备阶段

调用者调用2个服务的 try 接口。

扣钱服务的try接口中对 A 的余额进行验证,如果可用余额不少于30元,则冻结30元,返回 yes,否则返回 no。

加钱服务的try接口对 B 账号进行验证,例如是否合法可用,是则返回 yes,否则返回 no。

这个阶段保证了扣钱可扣、加钱可加。

  • 阶段2:提交阶段

try 接口如果都返回了 yes,调用者调用2个服务的 confirm 接口。

扣钱服务实际扣减A的30元,加钱服务实际给B加30元。

try 接口如果有返回 no 或者超时的,调用者调用2个服务的 cancel 接口。

扣钱服务解冻A的30元,加钱服务什么也不用做。

异常控制

下面几个是典型的异常情况:

  • 空回滚

现象是 try 没被执行,就调用了 cancel。

例如在某些异常情况下,调用 try 时出现异常,try 接口实际没有被调用,自然没有返回 yes,那么会按照正常流程进入第2阶段,调用 cancel 接口,这就形成了空回滚。

解决方法:让 cancel 能够识别出这是一个空回滚,可以记录事务执行状态,cancel 中判断 try 是否执行了。

  • 幂等

提交阶段异常时可能会重复调用 confirm 和 cancel,所以要实现幂等,保证多次执行效果一致。

解决方法:记录事务执行状态,如果执行过了,就不再执行。

  • 悬挂

现象是先执行了 cancel,后执行的 try,造成资源没人释放。

例如调用 try 时网络拥堵超时,被认为失败,然后调用 cancel,这时事务相当于结束了,但后来网络好点之后 try 开始执行了,锁定了相关资源,因为事务已经结束,confirm、cancel 都不会再调用了,就造成资源悬挂,无法释放。

解决方法:还是记录事务执行状态,try 执行时判断 cancel 是否执行了。

小结

TCC是应用层面的分布式事务解决方案,类似2PC,也是2阶段提交,分为准备阶段、提交阶段。

实现时需要注意空回滚、幂等、悬挂问题,可以通过记录事务状态来解决。

优点:

  1. 可靠性高

  2. 实时性高

缺点:

  1. 开发复杂度高

  2. 因为事务状态管理,需要多次DB操作,性能有一定损耗

TCC框架:

  1. https://github.com/changmingxie/tcc-transaction

  2. https://github.com/seata/seata

内容整理自:

分布式事务方案 - 最终一致性

高并发的常用策略

事务失败返回_分布式事务方案 TCC相关推荐

  1. 事务失败返回_什么是分布式事务以及有哪些解决方案?

    1.什么是分布式事务? 答:指一次大的操作由不同的小操作组成的,这些小的操作分布在不同的服务器上,分布式事务需要保证这些小操作要么全部成功,要么全部失败.从本质上来说,分布式事务就是为了保证不同数据库 ...

  2. mysql分布式事务wcf_WCF系列_分布式事务(下)

    1.WCF分布式事务例子 这里也用转账的例子说事. 用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B的相应账户的资金就增加多少. 系统A机器上有数据库AccountA, ...

  3. 分布式系统漫谈【拾】_分布式事务一致性:阿里方案

    上篇文章:分布式系统漫谈[玖]_分布式事务一致性:协议支持 其实对于生产环境的分布式事务一致,各大互联网公司都是自己实现的解决方案,总结起来无非是异步.补偿.实时查询.定期校对几种模式,大部分场景都是 ...

  4. 一致 先验分布 后验分布_分布式事务常见解决方案与最终一致性

    小编推荐:互联网大背景下,微服务盛行,平时开发中难免会遇到分布式事务问题.大家经常会听到CAP原理,即一致性(Consistency).可用性(Availability).分区容错性(Partitio ...

  5. ole db 访问接口 sqlncli 无法启动分布式事务_分布式事务,看这篇就够了

    0. 前言 1. 单数据源事务 & 多数据源事务 2. 常见分布式事务解决方案 2.1. 分布式事务模型 2.2. 二将军问题和幂等性 2.3. 两阶段提交(2PC) & 三阶段提交( ...

  6. 分布式模块之间的调用_分布式事务

    一.什么是分布式事务: 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上. 比如说:电商系统中的订单系统与库存系统 图中包含了库存和订单两个 ...

  7. xa 全局锁_分布式事务如何实现?深入解读 Seata 的 XA 模式

    原标题:分布式事务如何实现?深入解读 Seata 的 XA 模式 作者简介:煊檍,GitHub ID:sharajava,阿里巴巴中件间 GTS 研发团队负责人,SEATA 开源项目发起人,曾在 Or ...

  8. rocketmq整合mysql事务_分布式事务(4)---RocketMQ实现分布式事务项目

    摘要: ,但是returnLocalTransactionState.COMMIT_MESSAG的时候*服务挂了,那么最终Brock还未收到消息的二次确定,还是个半消息,所以当重新启动的时候还是回调这 ...

  9. mysql分布式事务wcf_[转载]WCF系列_分布式事务(下)

    浏览到chnking的WCF的分布式事务处理不错,转载过来分享一下.1. WCF分布式事务例子这里也用转账的例子说事. 用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B ...

  10. 分布式事务详解【分布式事务的几种解决方案】彻底搞懂分布式事务

    文章目录 一.基本概念 什么是事务 本地事务 分布式事务 分布式事务产生的场景 二.分布式事务基础理论 CAP理论 CP - Consistency/Partition Tolerance AP - ...

最新文章

  1. 添加linux系统调用的两种方式
  2. python 爬虫ip代理
  3. 4月全球域名商域名解析量23强:西数解析量破百万
  4. JavaScript判断一个变量是对象还是数组
  5. 通向成功的23个方法
  6. .net core 使用Redis的发布订阅
  7. Spring的消息 Java Message Service (JMS)
  8. OpenShift 4 - 通过DaemonSet在指定Node上运行守护程序
  9. C++ string和c类型字符数组的比较
  10. React-引入图片的方法
  11. ESL系统的Docker化部署
  12. 经营微博的十个经典案例
  13. 概率论复习笔记3.0--假设检验
  14. 技术天才米勒 oracle,奇迹中的奇迹 WW之功能炫技篇
  15. 正则表达式在线测试一
  16. 机器学习之网格搜索调参sklearn
  17. C# 修改图片文件分辨率大小
  18. 物联网硬件安全与整改梳理(1)
  19. Discuz! version 5.0.0 suffers from a cross site sc
  20. hdu 6289 寻宝游戏

热门文章

  1. SQL中COUNT()函数介绍
  2. odoo 开发者模式添加计算字段
  3. 局域网从另一台电脑copy文件(Linux系统下)
  4. 【原创】k8s源代码分析-----kubelet(3)ContainerGC
  5. Android 深入ViewPager补间动画,实现类京东商城首页广告Banner切换效果
  6. ASP存储过程在开发中的应用分析。
  7. BlueViewer 地图加载分析(C#)
  8. 哈希(不可逆)加密通用类库函数
  9. openmv探索_1_helloworld
  10. 用Siamese和Dual BERT来做多源文本分类