在电商领域等互联网场景下,传统的事务在数据库性能和处理能力上都暴露出了瓶颈 。在分布式领域基于CAP理论以及BASE理论,有人就提出了柔性事务的概念 。在业内,关于柔性事务,最主要的有以下四种类型:两阶段型、补偿型、异步确保型、最大努力通知型几种 。我们前边讲过的2PC和3PC都属于两阶段型,两阶段型事务存在长期锁定资源的情况,导致可用性差 。接下来我们来介绍的TCC则是补偿型分布式事务 。
TCCTCC 事务介绍TCC方案是可能是目前最火的一种柔性事务方案了 。关于TCC(Try-Confirm-Cancel)的概念,最早是由Pat Helland于2007年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出 。在该论文中,TCC还是以Tentative-Confirmation-Cancellation命名 。正式以Try-Confirm-Cancel作为名称的是Atomikos公司,其注册了TCC商标 。国内最早关于TCC的报道,应该是InfoQ上对阿里程立博士的一篇采访 。经过程博士的这一次传道之后,TCC在国内逐渐被大家广为了解并接受 。
TCC将事务提交分为Try-Confirm-Cancel 3个操作 。
- Try:预留业务资源/数据效验;
- Confirm:确认执行业务操作;
- Cancel:取消执行业务操作 。

文章插图
TCC示例假设用户下单操作来自3个系统下单系统、资金账户系统、红包账户系统,下单成功需要同时调用资金账户服务和红包服务完成支付
假设购买商品1000元,使用账户红包200元,余额800元,确认支付 。
Try操作
- tryX 下单系统创建待支付订单
- tryY 冻结账户红包200元
- tryZ 冻结资金账户800元
- confirmX 订单更新为支付成功
- confirmY 扣减账户红包200元
- confirmZ 扣减资金账户800元
- cancelX 订单处理异常,资金红包退回,订单支付失败
- cancelY 冻结红包失败,账户余额退回,订单支付失败
- cancelZ 冻结余额失败,账户红包退回,订单支付失败
缺点:主业务服务和从业务服务都需要进行改造,从业务方改造成本更高 。以上文中的订单服务为例,2PC中只需要提供一个下单接口即可,而TCC中缺需要提供Try-Confirm-Cancel三个接口,大大增加了开发量 。
TCC变种国内厂商在TCC实战中,提出了三种TCC变种实现:
- 通用型TCC,如果我们上面介绍的TCC模型实例,从业务服务需要提供try、confirm、cancel
- 补偿性TCC,从业务服务只需要提供Do和Compensate两个接口
- 异步确保型TCC,主业务服务的直接从业务服务是可靠消息服务,而真正的从业务服务则通过消息服务解耦,作为消息服务的消费端,异步地执行 。
而柔性事务(遵循BASE理论)放弃了隔离性,减小了事务中锁的粒度,使得应用能够更好的利用数据库的并发性能,实现吞吐量的线性扩展 。异步执行方式可以更好的适应分布式环境,在网络抖动、节点故障的情况下能够尽量保障服务的可用性 (Availability) 。因此在高可用、高性能的应用场景,柔性事务是最佳的选择 。
我是御狐神,欢迎大家关注我的微信公众号:wzm2zsd

文章插图
参考文档分布式事务之柔性事务
柔性事务 :TCC两阶段补偿型
【mq分布式事务 四 分布式事务之TCC】本文最先发布至微信公众号,版权所有,禁止转载!
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
