周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

15 | 分布式事务之TCC与SAGA

你好,我是周志明。
今天,我们接着上一节课的话题,继续讨论另外两种主流的分布式事务实现方式:TCC 和 SAGA。

TCC 事务的实现过程

TCC(Try-Confirm-Cancel)是除可靠消息队列以外的另一种常见的分布式事务机制,它是由数据库专家帕特 · 赫兰德(Pat Helland)在 2007 年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出的。
在上一讲,我给你介绍了可靠消息队列的实现原理,虽然它也能保证最终的结果是相对可靠的,过程也足够简单(相对于 TCC 来说),但现在你已经知道,可靠消息队列的整个实现过程完全没有任何隔离性可言。
虽然在有些业务中,有没有隔离性不是很重要,比如说搜索系统。但在有些业务中,一旦缺乏了隔离性,就会带来许多麻烦。比如说前几讲,我一直引用的 Fenix's Bookstore 在线书店的场景事例中,如果缺乏了隔离性,就会带来一个显而易见的问题:超售。
事例场景:Fenix's Bookstore 是一个在线书店。一份商品成功售出,需要确保以下三件事情被正确地处理:
用户的账号扣减相应的商品款项;
商品仓库中扣减库存,将商品标识为待配送状态;
商家的账号增加相应的商品款项。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

分布式事务是分布式系统中的重要组成部分,而TCC和SAGA是两种主流的分布式事务实现方式。TCC采用Try-Confirm-Cancel的实现过程,适合需要强隔离性的场景,但业务侵入性较强;而SAGA适用于需要灵活性的场景,通过将大事务拆分为一系列子事务和设计对应的补偿动作来实现。相比TCC,SAGA不需要为资源设计冻结状态和撤销冻结的操作,补偿操作相对容易实现。另外,文章还介绍了AT事务,它采用异步提交的模式,提升了系统的吞吐量水平,但牺牲了隔离性。总的来说,分布式事务中并没有一种解决方案能够解决所有问题,而是需要根据具体场景选择合适的事务处理方案。文章通过介绍可靠事件队列、TCC和SAGA,展示了实现最终一致性的三种主流模式,为读者提供了深入了解分布式事务实现方式的指导。 总结:文章介绍了TCC和SAGA两种主流的分布式事务实现方式,以及AT事务的异步提交模式。它们各有优缺点,适用于不同的场景。通过介绍这三种主流模式,文章展示了实现最终一致性的多种方式,为读者提供了深入了解分布式事务实现方式的指导。

该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 公众号:业余草
    比如执行都哪一步或者补偿到哪一步了。这段话感觉读不通

    作者回复: 感谢,是“比如执行都【到】一步或者补偿到哪一步了”,编辑同时看到了请更新一下。

    2021-01-04
    5
  • 渁皛の巧尅劦
    老师 可靠事件队列存在隔离线问题 会出现超售 tcc资源锁定可以解决超售,可是saga的反向恢复可以解决超售问题吗,我理解正向恢复就是可靠事件的实现方式,反向恢复是对于tcc的撤销优化 但是能解决超售吗?

    作者回复: 设想以下:手上10本书,同时卖给了2个人每人6本,此时反向恢复应该如何写?能够如何写?

    2021-03-30
    6
    2
  • 漂泊的小飘
    为什么saga要求ti和ci有交换性呢,不都是ti执行过或者执行不成功后执行ci吗

    作者回复: 便于简化重试的场景。当ti反复执行多次,其中已经失败到一定次数,就可以开始ci。

    2021-03-03
    1
  • Helios
    为什么消息队列会有隔离性问题呢,不是能通过topic隔离么

    作者回复: 隔离性是数据库的Isolation属性,topic隔离了消息,只能保证每个消息的消费者独立执行,但并不代表这些消费者操作的数据就天然地具备Isolation

    2021-02-03
    1
  • 丁乐洪
    周博士的书必须买呀

    作者回复: 感谢支持

    2021-01-22
    1
  • 恒仁
    老师,我理解不管采用哪种方式,库存本身的设计也应该保证在调用库存系统扣减库存时不会超售的情况呢?

    作者回复: 可是“库存”并不是一个整体,它是有多个独立节点构成的集群,如果不做额外处理,并不会有什么天然的约束去保证不会超售。

    2020-12-22
    5
  • 子夜枯灯
    感谢老周的持续分享,整体学习下来干货满满。来龙去脉讲的很清晰。

    作者回复: 感谢认可

    2020-12-21
  • zhanyd
    TCC Try: 尝试执行阶段,完成所有业务检查,锁定必须的业务资源(冻结金额,库存等) Confirm:确认执行阶段,利用锁定的业务资源,来完成业务处理 Cancel:取消执行阶段,释放Try阶段锁定的业务资源 优点:几乎不会涉及到锁和资源的争用,具有很高的性能潜力。 缺点:Try,Confirm,Cancel功能需要自己编码实现,业务侵入性较强。 Saga 把大事务拆分成若干个子事务,T1,T2,…,Ti,…,Tn 每一个子事务都对应一个补偿动作,C1,C2,…,Ci,…,Cn 如果 Ti 事务提交失败,整个事务要回滚,通过补偿动作 Ci,…,C2,C1 依次恢复 T1,T2,…,Ti 事务造成的影响,回到初始状态。 Saga 模式适用于业务流程长,业务流程多且需要保证事务最终一致性的业务系统。 优点:一阶段提交本地数据库事务,无锁,高性能;补偿服务易于理解,易于实现。 缺点:Sage无法保证隔离性,需要额外加锁保证。
    2020-12-21
    34
  • 小动物
    可靠性消息队列 优点:简单。实现上的简单,结构上的简单。无需过多的考虑失败的情况。 缺点:优点本身也是缺点,过于简单其实也不简单,不是所有的业务都支持一定会成功这么一个简单的特性。同时会出现某一段时间数据不一致。 适用场景:业务简单或业务不应该失败甚至不关心业务结果的情况。如消息推送,数据同步等。 TCC 优点:隔离、无锁。将过程拆解后,各个步骤均无需锁的介入即可完成。允许业务失败。 缺点:对业务要求较高,直接影响业务的结构设计。需要预留出冻结的行为。 适用场景:涉及业务系统均可控,有修改结构的权限,同时业务允许出现冻结概念更好。流程复杂,隔离性要求高的场景。 SAGA 优点:对业务侵入性比tcc低些。同时支持前两者的能力。提出了补偿的概念,使得业务更容易支持。 缺点:隔离性。若涉及业务多,可能会出现某些业务在最终一致性前被再次操作,导致错误 适用场景:支持业务补偿的场景。如订单的支付发货部分,发货失败退款即可。 这些思路,其实可以组合使用,不一定要单选。
    2021-01-21
    21
  • 西门
    TCC : 资源先锁住,不行再释放;SAGA:资源先用了,不行还回去;正常的业务场景下,资源被使用要比还回去的概率高很多(个人感觉SAGA比TCC适用场景更多),但是一旦还不回去处理起来就太麻烦了,像金融这种严谨性高的行业不太允许出现这样的情况。
    2020-12-22
    17
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部