Seata 1.5.2 源码学习(Client端)

news2025/7/19 21:01:56

在上一篇中通过阅读Seata服务端的代码,我们了解到TC是如何处理来自客户端的请求的,今天这一篇一起来了解一下客户端是如何处理TC发过来的请求的。要想搞清楚这一点,还得从GlobalTransactionScanner说起。

启动的时候,会调用GlobalTransactionScanner#initClient()方法,在initClient()中初始化TM和RM

TM初始化,主要是注册各种处理器,最终构造一个处理器映射表,不再多说

HashMap<Integer/*MessageType*/, Pair<RemotingProcessor, ExecutorService>> processorTable = new HashMap<>(32);

重点关注RM初始化

RM初始化过程中,设置了 resourceManager 和 transactionMessageHandler,然后也是注册各种处理器,最终也是构造一个消息类型和对应的处理器的一个映射关系

可以看到,图中上半部分是RM特有的,下半部分与TM初始化注册处理器类似

然鹅,真正处理请求的还是靠调用各个处理器中的handler.onRequest()方法,于是问题的关键就很明显了,就在于handler

1.  ResourceManager

在了解ResourceManager之前,让我们首先了解一下ResourceManagerInbound和ResourceManagerOutbound

ResourceManagerInbound是处理接收到TC的请求的,是TC向RM发请求

ResourceManagerOutbound是处理流出的消息的,是RM向TC发请求

ResourceManager继承了二者,所以既负责向TC发请求,又负责接收从TC来的请求。

还记得刚才在RMClient中是怎么获取ResourceManager的吗?是调用DefaultResourceManager.get()获取的

DefaultResourceManager.get()得到的是一个单例DefaultResourceManager,创建DefaultResourceManager的时候会构建一个分支类型与ResourceManager的一个Map

2. TransactionMessageHandler

TransactionMessageHandler负责处理接收到的RPC消息

前面在 RMClient 中通过 DefaultRMHandler.get() 获取 TransactionMessageHandler

3. 消息处理

RMClient#init()的时候new了一个RmNettyRemotingClient

这里要记住,rmNettyRemotingClient的两个成员变量此时已经被赋值了:

  • resourceManager是DefaultResourceManager,
  • transactionMessageHandler是DefaultRMHandler

RmNettyRemotingClient构造方法中调用父类AbstractNettyRemotingClient的构造方法

可以看到,根据收到的RPC消息类型,从processorTable中获取对应的Processor,最后调用对应RemotingProcessor的process()方法进行处理消息

RemotingProcessor的实现类很多,挑其中一个RmBranchCommitProcessor看一下

真相大白,最终还是调DefaultRMHandler#handle()

捋一下这个过程

最后,补充一个,this为什么是DefaultRMHandler

补充二:AbstractTransactionRequestToRM

4. 分支事务提交(二阶段)

交给AsyncWorker去执行

可以看到:

  1. 封装成一个Phase2Context对象,并将其放入队列中
  2. 如果放入成功,则立即返回提交成功,后续交由定时任务执行
  3. 如果放入失败,则主动触发定时任务先执行一次,以便腾出空间来,待执行完后,队列里面就有空间了,再将任务放入队列,等待下一次定时任务执行
  4. 定时任务1秒执行一次,执行的时候将队列中的任务取出,然后循环遍历分段执行
  5. 执行的过程就是删除对应事务的undo log
  6. 如果过程中抛异常,则将任务再放回队列中

所以,RM收到TC发的提交指令后,仅仅只是删除该事务的undo_log表记录

5. 分支事务回滚(二阶段)

与提交类似

所以,回滚就是根据事务的undo_log进行回滚

6. 总结

1、启动时,自动代理数据源,应用GlobalTransactionalInterceptor,初始化TM和RM

2、进入@GlobalTransactional业务方法时,TM向TC发请求申请开启全局事务,并获得全局事务ID

3、业务方法调用远程服务接口完成业务处理

4、RM执行本地逻辑,注册分支事务,获取全局锁,成功后提交本地事务并写入undo_log,本地事务提交成功后向TC报告分支事务

5、TM发起全局事务提交请求,TC向所有已注册的RM发请求,让RM进行分支提交,删除本地undo_log

6、若执行失败,TM发起全局事务回滚,TC向所有RM发请求,回滚分支事务,还原数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机毕业设计】新冠疫情隔离人员信息管理系统+vue源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 网络的广泛应用给生活带来了十分的便利。所以把基于小程序的社区疫情防控管理与现在网络相结合&#xff0c;利用ssm框架技术建设基于小程序的社区疫情防控系统&#xff0c;实现基于小程序的社区疫情防控的信息…

双线路捆绑

双线路捆绑是在服务器上接入两条上网线路并行使用 以达到提高链路上下行带宽&#xff08;即上传和下载速度&#xff09;的目的 默认情况下双线路捆绑采用负载均衡模式&#xff0c;并可更改为互为备份模式。 在负载均衡模式下&#xff0c;双线路的使用是基于会话的&#xff0…

已经有 MESI 协议,为什么还需要 volatile 关键字?

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了 CPU 的缓存一致性问…

树莓派使用docker搭建owncloud私有云--外挂硬盘

一&#xff0e;安装docker 1. 一键脚本&#xff1a; sudo curl -sSL https://get.docker.com | sh2. 查看docker是否安装成功 docker -v出现版本号即为成功 二&#xff0e;每次开机自动挂载硬盘到树莓派 sudo nano /etc/fstab在最后一行加入挂载信息 /dev/sda1 /home/pi/…

[附源码]java毕业设计农村政务管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]SSM计算机毕业设计智慧农业销售平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

多进程编程 VS 多线程编程

目录 一、进程 & 线程 二、进程与线程的优劣势 三、在什么场景下需要使用多进程编程&#xff1f; 进程也可以称为是“任务”。操作系统要想执行一个具体的“动作”&#xff0c;就需要创建出一个对应的进程。 一个程序在没有运行的时候&#xff0c;它仅仅是一个“可执行…

RHCE学习 --- 第六次作业

RHCE学习 — 第六次作业 首先要先装DNS服务器需要的包 [rootlocalhost ~]# yum install bind -y然后开始配置DNS服务 配置文件位置在/etc/named.conf下&#xff0c;建议先备份 注&#xff1a;备份的时候要cp -a&#xff0c;否则所属组会变&#xff0c;导致文件不可用 然后编辑…

WinForm,可能是Windows上手最快的图形框架了

文章目录Label和控件属性按钮和回调逻辑事件常用控件Label和控件属性 WinForm是一门非常经济实惠的技术&#xff0c;就是说&#xff0c;可以在短时间内学会&#xff0c;并迅速借此进行项目开发。尽管在很多方面不够现代&#xff0c;做出来的东西又Low又丑&#xff0c;但绝大多…

Redis的优惠券秒杀问题(六)超卖问题、一人一单问题

Redis的优惠券秒杀问题&#xff08;六&#xff09;超卖问题、一人一单问题 超卖问题 问题描述 使用Jmeter进行压测 发生超卖问题原因分析 解决方案 悲观锁与乐观锁 1. 版本号 2. CAS法 CAS三大问题&#xff08;题外话&#xff01;&#xff09; CAS三大问题的解…

误差和梯度下降

Datawhale开源学习&#xff0c;机器学习课程&#xff0c;项目地址&#xff1a;https://github.com/datawhalechina/leeml-notes 之前讲了线性模型&#xff0c;提到了误差&#xff0c;那么误差来自哪里&#xff1f;本节内容将介绍「偏差」、「方差」对模型拟合度的影响&#xff…

西电计组II 实验1

西电计组II 实验1 文章目录西电计组II 实验18086汇编 IO操作环境搭建8086汇编 helloworldassumesegmentdb编译链接lstmapobjexesymdobint 21H 软件中断程序设计要求全局变量函数设计putchargetcharprintnewlineinputmemsetexithexbinarycircle程序入口完整代码8086汇编 IO操作 …

wav to image 的数据集制作代码

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

python+django网吧会员管理系统

系统项目截图 本网吧管理系统主要包括三大功能模块&#xff0c;即管理员、会员、网管。 &#xff08;1&#xff09;管理员模块&#xff1a;首页、个人中心、会员管理、网管管理、商品类型管理、商品信息管理、购买商品信息管理、呼叫网管管理、电脑信息管理、用户上机管理、用户…

汇编语言外中断

外中断 文章目录外中断1.外中断概念2.PC机键盘的处理过程1.外中断概念 CPU在计算机系统中&#xff0c;除了能够执行指令&#xff0c;进行运算以外&#xff0c;还应该能够对外部设备进行控制&#xff0c;接收它们的输入&#xff0c;向它们进行输出&#xff08;I/O能力&#xff0…

如何把家装修出温馨的感觉?极家好不好

如何把家装修出温馨的感觉&#xff1f;极家好不好&#xff1f;想要让家变成理想的样子&#xff01;如何进行&#xff01; 第一步&#xff1a;找一个靠谱的装修团队&#xff0c;特别重要的是项目经理&#xff0c;极家好不好这个真的真的真的很重要‼️ 一个好的装修团队&#xf…

Windbg可以看到Visual Studio中看不到的有效函数调用堆栈

目录 1、Visual Studio中看不到有效的函数调用堆栈 2、使用Windbg调试运行主程序&#xff0c;看到了有效的函数调用堆栈 3、根据函数名和行号去查看对应的C源码&#xff0c;定位问题 4、总结 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持…

Frechet distance距离计算原理及python实现

Frechet distance概念 弗雷彻距离(Frechet distance)定义了一种考虑位置和点的次序的计算两条曲线相似度的方法&#xff0c;常用于时间序列相似度度量和轨迹序列相似度度量。该指标的算法可用the walking dog problem来描述&#xff1a;想象一个人用牵引带遛狗的同时&#xff0…

“碳”零排放是什么意思

在气候变化问题上拖拖拉拉之后&#xff0c;澳大利亚联邦政府终于承诺到 2050 年实现净零排放&#xff0c;世界其他大部分地区也是如此。几乎所有发达经济体现在都加强了 2030 年目标&#xff0c;并承诺在本十年将排放量大致减半。 需要记住的重要一点是&#xff0c;如果没有本…

abbyy finereader2023泰比文字识别PDF编辑软件

近年来&#xff0c;随着盲人数字阅读的普及推广&#xff0c;PDF格式的电子书越来越受到大家的关注和喜爱&#xff0c;但受读屏软件功能的限制&#xff0c;扫描版的PDF电子书是无法直接阅读的&#xff0c;这就需要将其转换为可阅读的文档格式&#xff0c;可对于大多数视障读者来…