开发者社区 > 云原生 > 中间件 > 正文

为什么seata中,分支事务注册时, 全局事务状态不是begin?

为什么seata中,分支事务注册时, 全局事务状态不是begin?

展开
收起
十一0204 2023-07-11 07:49:01 110 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    当一个分支事务注册时,全局事务状态不一定是 "begin",这是因为 Seata 实现了分布式事务的协调器和参与者分离的模式。具体来说,全局事务状态的变化过程如下:

    应用程序发起全局事务,并向 Seata 事务协调器注册全局事务。

    Seata 事务协调器为该全局事务生成一个全局事务 ID,并将全局事务状态设置为 "Begin"。

    应用程序的各个分支事务向 Seata 事务协调器注册分支事务,并将全局事务 ID 作为参数传递给 Seata。

    Seata 事务协调器为每个分支事务生成一个分支事务 ID,并将分支事务 ID 返回给应用程序。

    应用程序的各个分支事务向 Seata 事务协调器汇报事务执行状态,并将分支事务 ID 作为参数传递给 Seata。

    Seata 事务协调器根据各个分支事务的执行状态更新全局事务状态,例如 "Committing"、"Rolling back" 等。

    在所有分支事务都执行完成后,Seata 事务协调器将全局事务状态设置为 "Committed" 或 "Rollbacked"。

    2023-07-29 09:03:16
    赞同 展开评论 打赏
  • 在Seata中,当分支事务注册时,全局事务状态不是BEGIN的原因可能有几种:

    1. 分支事务注册时机:Seata采用的是TCC(Try-Confirm-Cancel)模式来实现分布式事务。在TCC模式中,分支事务的注册发生在业务方法的try阶段,而全局事务的状态在confirmcancel阶段进行更新。因此,在分支事务注册时,全局事务状态可能仍然是UNKNOWN状态。

    2. 异步通知延迟:Seata的全局事务和分支事务之间的状态更新可能是异步的,可能存在一定的延迟。当您查询全局事务状态时,可能会出现尚未同步更新的情况,导致看到的状态不是最新的。

    3. 全局事务回滚:如果在分支事务注册期间出现异常,全局事务可能已经被标记为回滚状态,而不是BEGIN。这可以是由于业务流程错误、分支事务异常或其他原因导致的。

    请注意,以上只是可能的原因之一,具体原因需要根据您的具体场景和代码进行排查。建议使用Seata提供的日志和监控功能来跟踪事务状态,并确保正确处理并发和异常情况。

    2023-07-28 16:14:11
    赞同 展开评论 打赏
  • 意中人就是我呀!

    "A:

    异常:Could not register branch into global session xid = status = Rollbacked(还有Rollbacking、AsyncCommitting等等二阶段状态) while expecting Begin

    描述:分支事务注册时,全局事务状态需是一阶段状态begin,非begin不允许注册。属于seata框架层面正常的处理,用户可以从自身业务层面解决。

    出现场景(可继续补充)

    分支事务是异步,全局事务无法感知它的执行进度,全局事务已进入二阶段,该异步分支才来注册
    服务a rpc 服务b超时(dubbo、feign等默认1秒超时),a上抛异常给tm,tm通知tc回滚,但是b还是收到了请求(网络延迟或rpc框架重试),然后去tc注册时发现全局事务已在回滚
    tc感知全局事务超时(@GlobalTransactional(timeoutMills = 默认60秒)),主动变更状态并通知各分支事务回滚,此时有新的分支事务来注册。
    此回答整理自钉群“3群-Seata 开源讨论群”。"

    2023-07-12 09:44:25
    赞同 展开评论 打赏

为企业提供高效、稳定、易扩展的中间件产品。

相关电子书

更多
《Seata 1.3 新特性以及如何参与社区》 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载