分布式事务 中间件 Seata 源码分析 08 TCC 模式实现

TCC 原理图如下

分为如下几步

1.业务方调用各个微服务的try()方法,执行资源检查及预留操作
2.当所有try()方法均执行成功时,对全局事务进行提交,即由事务管理器调用每个微服务的confirm()方法
当任意一个方法try()失败(预留资源不足,抑或网络异常,代码异常等任何异常),由事物管理器调用每个微服务的cancle()方法对全局事务进行回滚
try(),  confirm()和cancel()方法,都需要业务方自己实现

先看下TCC的示例samples

业务调用方,通过GlobalTransactional注解开启事务,并调用各个服务提供方的try()方法

å¨è¿éæå¥å¾çæè¿°

服务提供方

TwoPhaseBusinessAction注解标记这是个TCC接口,同时指定commitMethod,rollbackMethod的名称
BusinessActionContext是TCC事务中的上下文对象
BusinessActionContextParameter注解标记的参数会在上下文中传播,即能通过BusinessActionContext对象在commit方法及cancle方法中取到该参数值

å¨è¿éæå¥å¾çæè¿°

一、先看下全局GlobalTransactionScanner 的wrapIfNessary方法

从配置中获取,如果disableGlobalTransaction是生效的,直接return 返回

1.对bean进行反射解析,获取方法上面的annotation,判断是否为一个tcc的bean,如果是tcc的proxy,就创建一个TccActionInterceptor拦截器

二、开启TCC全局事务

TCC模式业务调用方和AT模式一样,需要使用GlobalTransactional注解来开启全局事务

业务方法执行时,最终会被GlobalTransactionalInterceptor拦截,开启一个全局事务,获得全局事务id,即xid

代码如下图

先执行事务模板的方法,调用transactionalTemplate.execute

执行方法execute

1.获取或者创建一个全局globalTransaction

2.调用getTransactionInfo,获取事务信息

   2.1 循环globalTransaction的回滚方法,包装为rollbackRules,填充到事务信息transactionInfo,并且校验事务信息不为空

 3.调用beginTransaction,开启事务

1.transactionManager.begin(null, null, name, timeout);  通过tmRpcClient,同步调用,底层通过channel发送请求,并且获取应答response,从中获取xid

2.然后rootContext绑定这个全局xid

3.执行业务逻辑business

4.执行出现异常,就回滚

本质上还是通过channel,同步调用tc,返回response

5.如果没有出现异常,就tx调用commit提交全局事务

 分为几步

  1. 根据xid取出GlabalSession
  2. 关闭Session,防止再有分支注册尽量
  3. 修改状态为提交中
  4. 如果可以异步提交,则异步提交,否则同步提交,TCC类型,只能同步提交

6.最后触发事务完成的操作,调用triggerAfterCompletion()

   

总结一下全局事务提交的大致流程

业务方调用微服务无异常,通过TM发起事务提交请求
TC接收到事务提交请求后,通过Xid找到全局事务,再取出所有的分支事务
遍历分支事务,发出分支事务提交请求
TCC资源管理器RM接收到提交请求后,从本地TCCResource缓存中根据resourceId取出对应方法bean,反射调用commit方法
 

 

    

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Seata 是一个开分布式事务解决方案,它旨在解决分布式系统中的事务一致性问题。Seata 提供了一套完整的分布式事务解决方案,包括全局事务管理、分支事务管理和事务日志存储等功能。 要实现 Seata 分布式事务,你需要按照以下步骤操作: 1. 引入 Seata 相关依赖:在你的项目中引入 Seata 的依赖,可以通过 Maven 或 Gradle 进行引入。 2. 配置 Seata 相关参数:在你的项目中添加 Seata 的配置文件,配置包括全局事务组名称、事务日志存储方式、数据库连接信息等。 3. 开启全局事务:在你的业务代码中,通过调用 Seata 提供的 API 开启一个全局事务。一旦开启全局事务Seata 将对该事务进行管理。 4. 注册分支事务:在你的业务代码中,通过调用 Seata 提供的 API 注册分支事务。分支事务即参与全局事务的各个业务单元。 5. 提交或回滚分布式事务:在你的业务代码执行完毕后,根据业务结果选择提交或回滚全局事务。提交全局事务表示所有参与者都执行成功,回滚全局事务表示有任何一个参与者执行失败。 6. 监控事务状态:Seata 提供了一个控制台用于监控事务状态和统计信息,你可以通过配置和启动该控制台来查看事务的执行情况。 以上是简要的实现步骤,具体的细节和配置可以参考 Seata 的官方文档。希望这些信息对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值