自动驾驶公司漫酷科技获近亿元Pre-A轮融资
06-17
起源基本介绍 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获取。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-18
06-18
06-21
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用