seata源码-全局事务回滚服务端源码

本文深入探讨Seata服务端处理全局事务回滚的流程,从发起回滚请求到服务端的处理逻辑,包括:1) 查找并关闭全局事务;2) 执行doGlobalRollback,遍历并处理分支事务;3) 分支事务回滚通过Netty请求触发,由ResourceManager执行;4) 删除分支事务和全局事务;5) 解析关键方法如DefaultCore#rollback和SessionHelper#endRollbacked。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇博客来记录在发起全局事务回滚时,服务端接收到netty请求是如何处理的

1. 发起全局事务回滚请求

在这里插入图片描述
在前面的博客中,有说到过,事务发起者在发现分支事务执行异常之后,会提交全局事务回滚的请求到netty服务端,这里是发送全局事务回滚请求的代码,同样,这里的GlobalRollbackRequest这个对象很重要,可以看到,在netty客户端这里,只入参了XID,这个xid贯穿了全局上下文,在服务端就是根据这里xid,来确定是要处理哪个全局事务

2. 服务端处理逻辑

在前面netty全局事务开启服务端源码中,有介绍过,netty服务端接收到客户端的请求之后,最终会进入到这个方法中,根据请求的对象类型,来决定是有哪个对象来处理
在这里插入图片描述

io.seata.server.AbstractTCInboundHandler#handle(io.seata.core.protocol.transaction.GlobalRollbackRequest, io.seata.core.rpc.RpcContext)

在这个方法中,会继续调度
在这里插入图片描述

可以发现,在doGlobalRollback方法中,最终,调用了core.rollback()
在这里插入图片描述

2.1 io.seata.server.coordinator.DefaultCore#rollback

在这里执行回滚的时候,有三个步骤

  1. 根据xid,找到netty服务端的globalSession
  2. 调用globalSession的close()方法,这个方法只是把globalSession的active属性设置为false了
  3. 最后会调用doGlobalRollback()方法,最核心的逻辑在这个方法中

在这里插入图片描述

2.2 doGlobalRollback

io.seata.server.coordinator.DefaultCore#doGlobalRollback

下面这是执行全局事务回滚的核心代码

  1. 会先根据全局事务,获取到所有的分支事务
  2. 然后依次遍历所有的分支事务
  3. 如果分支事务是失败状态,就直接删除分支事务(从branchTable中删除)
  4. branchRollback 这里是通过netty请求,触发分支事务进行回滚的逻辑,这个下面单独说
  5. 接着就会对分支事务回滚成功/失败,做出相应的处理;如果处理成功,会把branchTable和lockTable中的数据删除
  6. 最后在所有分支事务都处理之后,对全局事务进行处理,endRollbacked 在这个方法中,会把globalTable中的全局事务删除
public boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException {
   
    boolean success = true;
    // start rollback event  这里没看懂,先跳过
    eventBus.post(new GlobalTransactionEvent(globalSession.getTransactionId(), GlobalTransactionEvent.ROLE_TC,
        globalSession.getTransactionName(), globalSession.getBeginTime(), null, globalSession.getStatus()));

    // 判断当前事务使用的模式
    if (globalSession.isSaga()) {
   
        success = getCore(BranchType.SAGA).doGlobalRollback(globalSession, retrying
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值