TCC

在前一篇文章中讲到了BASE模式,这种模式可以应用在单库or跨库事务的场景下。事实上BASE模式不仅仅局限于数据库层面,还可以应用于分布式系统,这类分布式系统最典型的例子就是电商平台,它们有以下几个特征:

SOA化/微服务化:单体应用拆分成多个服务。

数据库的各种拆分技术的运用:分表、分库、分区。

大量NoSQL数据库的兴起。

应用之间的通信手段并非直接读数据库:RESTful、RPC、消息中间件等。

大量跨应用事务的出现。

在这种场景下,2PC(及XA)已经无法满足需求,因为它:

性能低下,2PC协议是阻塞式的。当协调的数据库越来越多时,性能无法接受。

无法水平扩展以提升性能,只能靠垂直扩展(提升硬件)——更快的CPU、更快更大的硬盘、更大更快的内存——但是这样很贵,并且很容易遇到极限。

染指其他数据库。

依赖于数据库是否支持2PC(XA)。

而BASE只解决最后提交的问题,不能解决诸如在上一篇文章中最后提到的如何保证刷卡消费不透支的问题.于是就有人提出了TCC模式(Try、Confirm、Cancel),这一模式在国内因阿里巴巴的推广而广为人知。

协议介绍

在TCC协议里,参与的主体分为两种:

发起方:发起事务的应用。

参与方:执行事务请求,手上握有资源的服务。

并且有三种动作:Try、Confirm、Cancel。

TCC是Try、Confirm、Cancel的简称,它们分别的职责是:

Try:负责预留资源(比如新建一条状态=PENDING的订单),同时也做业务检查(比如看看余额是否足够),简单来说就是不能预留已经被占用的资源。

Confirm:负责落地所预留的资源(比如扣费、把订单状态变成COMPLETED)

Cancel:负责撤销所预留的资源(比如把订单状态变成CANCELED)

关于预留资源要多说两句,资源都是有限的,因此预留资源都是有时效的,如果当预留资源迟迟得不到Confirm——我们将这种情况称为timeout——参与方会自行将其Cancel(这里有坑,下面会讲)。也就是说参与方对于资源具有自我管理能力,这样可以避免因发起方的问题导致资源被长期占用。

TCC于BASE相比,增加了业务检查和撤销事务的功能。

同时,TCC将2PC数据库层面的动作提升到了服务层面,不同的是TCC的所有动作都是一个本地事务,每个本地事务都在动作完成后commit到数据库:

Try相当于2PC的Commit request phase,外加了业务检查逻辑

Confirm相当于2PC的Commit phase的commit动作

Cancel相当于2PC的Commit phase的rollback动作

流程

以下是TCC的状态图:

下面是流程步骤(你会发现和2PC很像):

【发起方】发送Try到所有参与方

每个【参与方】执行Try,预留资源

【发起方】收到所有【参与方】的Try结果

【发起方】发送Confirm/Cancel到所有参与房

每个【参与方】执行Confirm/Cancel

【发起方】收到所有【参与方】的Confirm/Cancel结果

异常处理

从【发起方】的角度来看出现异常要怎么处理:

step 1发生异常,【发起方】可以什么都不做等待【参与方】自行Cancel,也可以直接发起Cancel请求

step 2、3发生异常,意味着【发起方】没有收到【参与方】的响应,这个时候因认定为失败,执行Cancel

step 4发生异常,【发起方】重试Confirm/Cancel

step 5、6发生异常,意味着【发起方】没有收到【参与方】的响应,这个时候因认定为失败,重试Confirm/Cancel

从【参与方】角度来看看看出现异常怎么处理:

step 1,意味着【参与方】没有收到请求,什么都不需要做

step 2,意味着【参与方】没有执行成功,什么都不需要做

step 3,意味着【发起方】没有收到结果,什么都不需要做,等待【发起方】重试即可。【参与方】要保证prepare是幂等的。

step 4,等待【发起方】重试,或者等待timeout后自行Cancel。

step 5,等待【发起方】重试即可

step 6,意味着【发起方】没有收到结果,什么都不需要做,等待【发起方】重试即可,【参与方】要保证Confirm/Cancel是幂等的。

观察一下你就会发现TCC和2PC存在一样的问题:

若【发起方】/【参与方】因崩溃遗失了信息,则会造成有的【参与方】已Confirm,有的【参与方】则被Cancel了,甚至于依然保持在预留状态。

若【发起方】在step 4发送Confirm,而【参与方】在Cancel(因timeout导致)。

不过TCC在处理这种情况相比2PC具有一些优势,因为TCC是在服务层面的,当出现这种问题的时候可以很容易通过日志、业务数据排查出来,然后人工介入,而2PC完全是数据库底层的。

对于ACID的保证

TCC对于ACID的保证:

A,正常情况下保证

C,在某个时间点,会出现A库和B库的数据违反一致性要求的情况,但是最终是一致的

I,在某个时间点,A事务能够读到B事务部分提交的结果

D,和本地事务一样,只要commit则数据被持久

实现TCC时的注意事项

实现TCC需要关注以下几个方面:

TCC模式在于服务层面而非数据库层面

TCC模式依赖于各服务正确实现Try、Confirm、Cancel和timeout处理机制

TCC模式最少通信次数为2n(n=服务数量)

不是所有业务模型都适合使用TCC,比如发邮件业务根本就不需要预留资源

需要良好地设计服务的日志、人工处理流程/机制,便于异常情况的处理

参考资料

tcc php,事务 - TCC模式相关推荐

  1. 微服务seata 1.4.2 分布式事务TCC模式示例

    seata TCC模式和AT模式的基础环境是一样的,只是在实现方式上有所区别,而且TCC模式还可以和AT模式混合使用. 关于AT模式示例,可以参考seata 1.4.2 分布式事务AT模式示例. TC ...

  2. tcc分布式事务框架源码解析系列(四)之项目实战

    通过之前的几篇文章我相信您已经搭建好了运行环境,本次的项目实战是依照happylifeplat-tcc-demo项目来演练,也是非常经典的分布式事务场景:支付成功,进行订单状态的更新,扣除用户账户,库 ...

  3. TCC分布式事务的实现原理

    目录 一.写在前面 二.业务场景介绍 三.进一步思考 四.落地实现TCC分布式事务 (1)TCC实现阶段一:Try (2)TCC实现阶段二:Confirm (3)TCC实现阶段三:Cancel 五.总 ...

  4. 【分布式事务】tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)...

    一.背景 有一定分布式开发经验的朋友都知道,产品/项目/系统最初为了能够快速迭代上线,往往不太注重产品/项目/系统的高可靠性.高性能与高扩展性,采用单体应用和单实例数据库的架构方式快速迭代开发:当产品 ...

  5. tcc分布式事务_什么是 TCC分布式事务?

    近两年微服务变得越来越火热,各种框架与组件的出现,更是为微服务的开发提供了便利. 我们都知道,每个微服务都是一个对应的小服务,多个服务之间可以方便的进行功能的组合,来形成功能更强大的服务.服务间数据与 ...

  6. 什么是 TCC分布式事务

    转载自  什么是 TCC分布式事务 近两年微服务变得越来越火热,各种框架与组件的出现,更是为微服务的开发提供了便利. 我们都知道,每个微服务都是一个对应的小服务,多个服务之间可以方便的进行功能的组合, ...

  7. 《深入理解分布式事务》第八章 TCC 分布式事务原理

    <深入理解分布式事务>第八章 TCC 分布式事务原理 文章目录 <深入理解分布式事务>第八章 TCC 分布式事务原理 一.TCC 核心思想 二.TCC 实现原理 1.TCC 核 ...

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

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

  9. 手写基于Spring Cloud的TCC分布式事务框架

    如何简单实现TCC分布式事务框架 最近听到很多其他公司的小伙伴谈分布式事务的问题,各种业务场景都有,可能就是这两年很多公司都在往微服务发展,现在各个子系统都拆分.建设的差不多了,实现了模块化开发,但是 ...

最新文章

  1. linux内核编译及系统裁减
  2. 优化SQL Server数据库查询方法
  3. 一个女程序员的男友需求说明书(转)
  4. 百练2757:最长上升子序列
  5. 银行系普惠和小贷系普惠,哪个贷款更靠谱?
  6. 如何运用领域驱动设计 - 领域事件
  7. Hbase2.0版本安装教程
  8. 从“小白”到“白帽子黑客”的实用指南
  9. Spring加载资源文件的方式
  10. hive数据的导入导出方式
  11. python3.6网络爬虫_python3.6网络爬虫
  12. CentOs7.3 搭建 Solr单机服务
  13. 0基础python入门书籍 excel_零基础学Python3(23):Excel 基础操作(上)
  14. 基于RFID定位技术下的机房资产管理系统,RFID资产管理解决方案--新导智能
  15. tbslog乱码转换_tbslog乱码转换
  16. Gin:路由抽离与分组
  17. 定义一个时间类Time,能提供和设置由时、分、秒组成的时间,并编出应用程序,定义时间对象,设置时间,输出该对象提供的时间。
  18. CodeForces 757 E.Bash Plays with Functions(积性函数+dp)
  19. 我的世界——scratch——种子
  20. 高斯核——Python实现

热门文章

  1. 让搜索无处不在,这一次百度来到了智能手表上
  2. Kali之——kali精简版安装后中文乱码
  3. java在线商城系统源码jsp+servlet+mysql实现的在线商城系统源码
  4. 【修改注册表加快上网速度的方法】
  5. Typorn退出全屏
  6. 华为 Pocket S 折叠屏手机 评测
  7. mysql json数组字符串转数组_数组、对象、字符串转JSON的函数
  8. 【原创工具】TE 中文编辑器 / c、c++、rust编辑器 / 轻量化数据清洗工具 for Windows
  9. 有多少人在51job上找到工作_到底有没有人在51job上找到过工作?
  10. Java集合类之Map的HashMap之常用方法的使用