Seata的TCC模式解读

发布于:2024-10-24 编辑:匿名 来源:网络

起源基本介绍 TCC的概念最早由Pat Helland在一篇题为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文中提出。本文中TCC仍以Tentative-Confirmation-Cancellation命名。

Try-Confirm-Cancel的正式名称为Atomikos,拥有TCC注册商标。概述 TCC 是 Try-Confirm-Cancel 的缩写。

TCC模式与AT模式非常相似。每个阶段都是一个独立的事务。

不同的是TCC是通过手工编码实现数据恢复。需要实现三种方法: Try:资源检测和预留。

做业务检查(一致性)和资源预留(隔离)只是现阶段的初步操作。它和后续的Confirm才能真正形成完整的业务逻辑。

确认:完成资源运营业务;如果Try成功,Confirm一定成功。确认提交。

Try阶段所有分支交易执行成功后,才会执行Confirm。通常情况下,使用TCC时,相信Confirm阶段不会出错。

即:只要Try成功,Confirm就一定会成功。如果Confirm阶段出现问题,需要引入重试机制或者手动处理。

Cancel:释放预留资源,可以理解为try的逆操作。当业务执行错误需要回滚的状态下,取消分支事务的业务执行,释放预留资源。

通常情况下,当使用TCC时,Cancel阶段就被认为是成功的。如果Cancel阶段出现问题,需要引入重试机制或者手动处理。

TM首先发起所有分支事务的try操作。如果任一分支事务的try操作失败,TM将发起所有分支事务的Cancel操作。

如果所有尝试操作都成功,TM将发起所有分支事务的确认操作,其中如果确认/取消操作失败,TM将重试。 AT模式和TCC模式的比较。

AT 模式。 TCC 模式。

第一阶段prepare,在本地事务中,将业务数据更新和对应的回滚日志记录与自定义的prepare逻辑一起提交。第二阶段提交立即成功结束,并进行自动异步批量清理。

滚动日志调用自定义提交逻辑。第二阶段回滚通过回滚日志自动生成补偿操作,完成数据回滚。

调用自定义回滚逻辑以及其他支持本地ACID事务的关系数据库,不依赖于底层数据资源的事务支持。 TCC 支持将自定义分支事务合并到全局事务管理中。

案例流程分析假设有一个扣除用户余额的业务。假设A账户原有余额为 ,需要扣除30元余额。

第一阶段(尝试):检查余额是否充足。如果足够,则冻结金额增加30元,并从总金额30元=冻结金额+可用金额中扣除可用余额,数量不变。

事务直接提交,无需等待其他事务。第二阶段(确认):现在库存充足,可以提交(确认)。

冻结金额扣除30即可提交确认。不过之前已经扣除了可用金额。

这里您只需清除冻结金额即可。第二阶段(取消):如果库存不足,需要回滚(取消),则冻结金额会扣除30,可用余额增加30,需要回滚,则冻结金额将被释放并恢复可用量: TCC注意事项 清空回滚不调用TCC资源 在Try方法的情况下,会调用两阶段的Cancel方法。

Cancel方法需要识别这是一个空回滚然后直接返回成功。原因是当分支事务出现服务宕机或者网络异常时,分支事务调用会被记录为失败。

此时Try阶段并没有真正执行。当故障恢复后,分布式事务回滚时会调用第二阶段的Cancel。

方法,导致空回滚。解决的关键是识别这个空回滚。

这个想法很简单:你需要知道一个阶段是否被执行。如果执行了,就是正常回滚;如果不执行,则为空回滚。

前面提到,TM在发起全局事务时会生成全局事务记录,全局事务ID贯穿整个分布式事务调用链。添加额外的分支事务记录表,其中包含全局事务ID和分支事务ID。

第一阶段的Try方法中会插入一条记录,表明第一阶段已经执行完毕。在取消界面中读取记录。

如果记录存在,则正常回滚;如果该记录不存在,则回滚为空。幂等为了保证TCC的两阶段提交重试机制不会造成数据不一致,要求TCC的两阶段Try、Confirm、Cancel接口具有幂等性,这样资源就不会被重用或释放。

如果幂等控制做得不好,很可能会导致数据不一致等严重问题。解决办法是在上面的“分支事务记录”中添加执行状态,并在每次执行前查询状态。

暂停是指对于分布式事务来说,第二阶段的Cancel接口先于Try接口执行。原因是当RPC调用分支事务try时,先注册分支事务,然后再执行RPC调用。

如果此时RPC调用的网络发生拥塞,则RPC调用通常会有超时时间。 RPC超时后,TM会通知RM响应。

回滚分布式事务,有可能回滚完成后,RPC请求到达参与者实际执行,而Try方法预留的业务资源只能被分布式事务使用。分布式事务第一阶段预留的业务资源 没有人可以再处理该资源。

这种情况称为暂停,即业务资源被预留后无法继续处理。解决方案是,如果第二阶段完成,则该阶段无法继续执行。

执行一级事务时,判断全局事务下的“分支事务记录”表中是否已经有二级事务记录。如果有的话,Try不会被执行。

具体来说,需要在上面描述的接口上添加@LocalTCC注解,表示实现该接口的类由seata管理。 Seata会根据交易的状态自动调用我们定义的方法。

如果没有问题,则调用Commit方法,否则调用Rollback。方法。

代码语言:javascript copy @LocalTCCpublic interface AccountTCCService {}@TwoPhaseBusinessAction 该注解用在接口的Try方法上。该注解的用法如下: 代码语言:javascript copy @LocalTCCpublic interface AccountTCCService { @TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel") void deduct(@BusinessActionContextParameter(paramName = "userId") ") String userId, @BusinessActionContextParameter(paramName = "money")int Money);布尔确认(BusinessActionContext ctx); boolean cancel(BusinessActionContext ctx );} 此注释包含这些属性。

name是tcc方法的bean名称,需要全局唯一。一般只写方法名即可; commitMethod自然就写了Commit方法的方法名; rollbackMethod写入Rollback方法的方法名; @BusinessActionContextParameter。

注解用于修改Try方法的输入参数。修改后的输入参数可以通过Commit方法和Rollback方法中的BusinessActionContext获取。

Seata的TCC模式解读

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 自动驾驶公司漫酷科技获近亿元Pre-A轮融资

    自动驾驶公司漫酷科技获近亿元Pre-A轮融资

    投资圈(ID:pedaily)5月24日消息,上海漫酷科技股份有限公司近日宣布完成近亿元Pre-A轮融资-A轮融资。 本轮融资由独家天使投资人江门创投联合领投,盐城国智、生益资本、招商启航跟投。 本轮融资将用于自动驾驶核心传感器、人工智能算法、域控制器的自主研发,以及全球领先

    06-17

  • 科技传播与产业融合专门委员会在京成立

    科技传播与产业融合专门委员会在京成立

    7月21日下午,中国科协科技传播与产业融合专门委员会在京成立。 专家学者及通信、互联网、大众创业、媒体等各领域机构代表出席并参与本次研讨会。 第十二届全国政协人口资源环境委员会副主任、中国科协原副主席主席,全国政协副主任、副主任书记党组成员出席会议并讲话。 齐让

    06-18

  • 今年一季度,20家中国企业赴美IPO,融资总额同比增长1081%

    今年一季度,20家中国企业赴美IPO,融资总额同比增长1081%

    德勤中国数据显示,今年一季度,共有20家中国企业赴美IPO,融资总额同比增长1081%。 20家中国企业赴美上市,较去年同期的6家增长%;融资总额为43.7亿美元,较去年同期的3.7亿美元增长%。

    06-17

  • CATL与长城汽车签署十年长期战略合作协议

    CATL与长城汽车签署十年长期战略合作协议

    宁德时代新能源科技有限公司与长城汽车股份有限公司正式签署十年长期战略合作框架协议位于保定的哈弗技术中心。 早在2009年,宁德时代与长城汽车就开始了车型的联合开发。 此后,双方针对哈弗、WEY、欧拉等多个品牌展开了全方位的技术研发和供应合作。

    06-18

  • 太烦人了,网络上到处都是谣言

    太烦人了,网络上到处都是谣言

    每隔一段时间,我们就会看到一服就晕的摇头丸、一见面就刺你的外地人、要你关机的宇宙射线对付它们的电子设备,还有突如其来的SB病毒……真不明白为什么过一段时间类似的传言又会再次出现。 即使随着时间的推移,它们也会与时俱进,转变为各种版本,继续存在于互联网上。 以前

    06-21

  • 滴滴出行与全球领先能源公司BP成立合资公司,布局新能源汽车充电网络

    滴滴出行与全球领先能源公司BP成立合资公司,布局新能源汽车充电网络

    据投资界8月1日消息,滴滴出行与全球领先能源公司BP宣布,成立合资公司,共同建设、开发和运营新能源汽车充电站,为滴滴及社会企业提供高效、便捷的充电服务。 目前,BP在广州建设的首个桩站已接入滴滴小桔充电平台,正在进行试运营。 合资公司成立后,充电桩站的建设和运营

    06-18

  • 腾讯云亮相GITEX Global 2023,助力阿布扎比打造公共服务超级应用

    腾讯云亮相GITEX Global 2023,助力阿布扎比打造公共服务超级应用

    2020年10月18日,在迪拜举办的全球科技展GITEX Global上,腾讯云与酋长国政府支持部达成合作阿布扎比政府与TAMM共同创建公共服务应用程序。 依托腾讯云小程序平台(TCMPP),TAMM将推出各类小程序,为公众提供服务。 此次合作将推动TAMM成为超级应用,提供覆盖30多个政府实体

    06-18

  • 中国核电:上半年净利润预计同比增长40%-43%

    中国核电:上半年净利润预计同比增长40%-43%

    中国核电今日发布公告称,预计上半年净利润同比增长比去年同期增加12亿元-13亿元,同比增长40%-43%。

    06-18

  • PK王思聪:陈欧OUT!马云OUT!冯小刚OUT!

    PK王思聪:陈欧OUT!马云OUT!冯小刚OUT!

    像王思聪这样看热闹的人自然不会太当真,因为他不会太当真就制造麻烦。 在网络上,网友戏称他为“撕葱”。 他批评俏江南、董事长、张兰散布谣言,指责京东欺骗顾客,起诉网易和搜狐侵犯他的姓名权,讽刺罗永浩没有兑现承诺……在一档节目中,主持人问道他:“你就不怕惹麻烦吗

    06-18

  • 昆仑万维拟投资5000万元自动驾驶公司小马智行

    昆仑万维拟投资5000万元自动驾驶公司小马智行

    据投资界消息,昆仑万维宣布,其全资子公司昆仑集团有限公司(以下简称“昆仑集团”)拟利用旗下自有资金投资5000万元。 美元投资自动驾驶公司小马智行,融资后获得3%股权。 昆仑万维表示,自动驾驶是人工智能领域的重要分支。 公司以自有资金投资小马汽车1万美元,积极布局

    06-18

  • 凯迪拉克:1月销量2.32万辆,同比增长18.4%

    凯迪拉克:1月销量2.32万辆,同比增长18.4%

    2月2日,凯迪拉克发布了今年1月销量。 报告显示,凯迪拉克1月销量0辆,同比增长18.4%。 其中SUV阵营销量5辆,轿车阵营销量1辆。

    06-18

  • 全产业链大型铜生产企业铜陵有色参与设立规模10亿产业基金

    全产业链大型铜生产企业铜陵有色参与设立规模10亿产业基金

    据投资界(ID:pedaily)4月28日消息,铜陵有色晚间披露一季度报告。 公司还披露,为打造国家级先进结构材料产业,推动公司产业链优化延伸,公司全资子公司铜陵有色金属集团上海国际致远资本投资有限公司铜陵市国有资本运营控股集团有限公司、铜陵市建设投资控股有限公司、铜

    06-18