Spring Cloud 微服务项目实战
姚秋辰(姚半仙)
PayPal 研发经理
15862 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
结束语 (1讲)
Spring Cloud 微服务项目实战
15
15
1.0x
00:00/00:00
登录|注册

35 | 分布式事务:使用 Nacos+Seata 实现 TCC 补偿模式

你好,我是姚秋辰。
上节课我们落地了一套 Seata AT 方案,要我说呢,AT 绝对是最省心的分布式事务方案,一个注解搞定一切。今天这节课,我们来加一点难度,从 Easy 模式直接拉到 Hard 模式,看一个巨复杂的分布式事务方案:Seata TCC。
说 TCC 复杂,那是相对于 AT 来讲的。在 AT 模式下,你通过一个注解就能搞定所有事情,不需要对业务层代码进行任何修改。TCC 难就难在它的实现方式上,它是一个基于“补偿模式”的解决方案。补偿的意思就是,你需要通过编写业务逻辑代码实现事务控制。
那 TCC 是如何通过代码来控制事务状态的呢?这就要说到 TCC 的三阶段事务模型了。

TCC 事务模型

TCC 名字里这三个字母分别是三个单词的首字母缩写,从前到后分别是 Try、Confirm 和 Cancel,这三个单词分别对应了 TCC 模式的三个执行阶段,每一个阶段都是独立的本地事务。
Try 阶段完成的工作是预定操作资源(Prepare),说白了就是“占座”的意思,在正式开始执行业务逻辑之前,先把要操作的资源占上座。
Confirm 阶段完成的工作是执行主要业务逻辑(Commit),它类似于事务的 Commit 操作。在这个阶段中,你可以对 Try 阶段锁定的资源进行各种 CRUD 操作。如果 Confirm 阶段被成功执行,就宣告当前分支事务提交成功。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了使用Nacos和Seata实现TCC补偿模式的分布式事务。作者首先生动地解释了TCC事务模型的三个阶段:Try、Confirm和Cancel,并通过考研占座的例子阐述了TCC的工作流程。随后,详细介绍了TCC的实现方式,包括注册TCC接口和编写三个阶段的具体逻辑。文章还涵盖了TCC空回滚和倒悬的处理方法,以及对幂等性的重要性进行了强调。总体而言,TCC相比AT而言,代码开发量要大大增加,但换取了事务的高度可控性。文章以实际代码和生动的比喻深入浅出地介绍了TCC的实现方式,为读者提供了一种落地TCC案例的实践经验。文章内容丰富,对于想要深入了解分布式事务的读者来说是一篇非常有价值的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring Cloud 微服务项目实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 奔跑的蚂蚁
    对于tcc 和 at 如果涉及到分布式事务 小公司 和 团队人数少的公司选择哪个好呢?还有别的更简单的方法吗

    作者回复: 小公司,小团队,可千万别上TCC,除非跟这家老板有仇。 更简单的方法,就是自建本地事务表+跑批job补偿,短链路用事务型消息也可以

    2022-03-04
    2
    13
  • 奔跑的蚂蚁
    老师能讲下 微服务的 后端接口 版本升级怎么控制的嘛,多个版本兼容怎么做的呢?是通过网关转发到不同的服务上吗。

    作者回复: 如果是用dubbo或者HSF的话,其实版本控制内置version属性就可以很好解决,但是如果是open feign这类对版本控制支持的并不咋样的组件,那我们一般就是采取/v1/v2这种path来区分。比如手机app,老版本新版本要同时支持,但业务差别很大,那么就新app用v2,老app用v1,直到老app强制更新后下线v1

    2022-03-04
    5
  • 西门吹牛
    之前看过Seata文档,看了老师的文章后,发现理解更深了,问个问题,关于AT隔离性问题,默认是读提交,这是因为全局事务中,每个分支事务都是直接提交的,所以针对全局事务来说,是需要读到其他事物中部分分支已经提交的事务吗?

    作者回复: 如果是串行执行的分布式事务,比如A->B->C,当执行到C的时候,A和B可以认为已经完成了Commit操作,所以C如果去捞数据的话,那么读到的就是AB步骤执行过后的数据。 另外针对全局事务来说,每个分支事务完成事务提交后会上报TC完成状态。

    2022-06-02
    1
  • peter
    请教老师几个问题: Q1:接口类指向是什么意思? 文中有一句话“将 CouponTemplateServiceImpl 的接口类指向刚定义好的 CouponTemplateServiceTCC 方法”,怎么指向的? Q2:阿里这种级别的公司,其入口是怎么做的? 网站最外面的入口,是怎么实现的?现有的外部网关,比如F5、Nginx、LVS等,处理速度都是有限的,对于阿里这种规模的公司,肯定是处理不过来的。那怎么解决这个问题? Q3:tomcat连接数与CPU核数的矛盾问题。 tomcat服务器一般能够支持500个连接,好像最大支持1000个连接;一个连接一个线程,那就是500个线程。但一般服务器的CPU核数也就是10个左右。一般的规律是:线程的数量一般是核数的2倍,也就是20个。20个和500个不矛盾吗?

    作者回复: 1. implements实现接口 2. 当年通过mtop来做,自研魔改黑科技。大厂一般都用各种自研产品 3. 我对tomcat调优并不精通,但是看这个问题好像出自面试宝典

    2022-03-04
    4
    1
  • GeekJohn
    要是新增操作,try阶段如何去锁定资源呢?那时数据库还没有生成记录。

    作者回复: Try阶段要结合具体业务场景看怎么锁定资源,有的时候是插入一条init状态的数据,到confirm阶段再改状态成为正式生效数据;有的是在日志表里通过幂等性ID来占坑锁定资源。需要结合具体要实现的业务来决定

    2023-09-26归属地:日本
  • 天天有吃的
    这个tcc的步骤怎么感觉跟2pc的一模一样啊?这两者有什么区别吗
    2023-11-09归属地:广东
  • Geek_5c44aa
    老师问个问题:使用Seata的时候,是否必须用Nacos作为微服务的注册中心?
    2023-10-21归属地:山东
    1
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部