当前位置: 首页 > news >正文

理解分布式事务TC\TM\RM

一、TC、TM、RM 核心定义 + 订单 / 账户服务 精准角色划分

1. 三大核心角色(绝对核心,牢记)

  • TC(Transaction Coordinator):事务协调者→ 独立部署的Seata Server 服务端,唯一的「总控中心」
    • 职责:统一生成分支事务 ID(BID)、维护 XID 和 BID 的一对多绑定关系、存储所有全局 / 分支事务状态、接收 TM 的全局提交 / 回滚指令、向 RM 下达分支提交 / 回滚指令,不参与任何业务逻辑
  • TM(Transaction Manager):事务管理器订单服务(order)就是唯一的 TM
    • 职责:分布式事务的发起者 / 入口,在标注@GlobalTransactional的方法里本地生成全局事务 ID(XID)→ 把 XID 绑定到自己的线程上下文 → 向 TC注册这个 XID 的全局事务→ 执行业务(创建订单 + 远程调用扣钱)→ 业务执行完后,只携带 XID 向 TC 发起「全局提交 / 回滚」指令。
    • 关键:TM只持有 XID,全程不碰 BID、不知道 BID 的存在
  • RM(Resource Manager):资源管理器订单服务 + 账户服务(account)都是 RM(RM 是「干活的执行者」,只要操作数据库 / 资源的都是 RM)
    • 订单服务(RM):执行「创建订单」的本地数据库操作,是全局事务下的第一个分支;
    • 账户服务(RM):执行「扣钱」的本地数据库操作,是全局事务下的第二个分支;
    • 职责:拿到 XID → 向 TC 注册分支事务、获取 TC 分配的 BID → 执行本地业务逻辑 → 等待 TC 的分支提交 / 回滚指令 → 执行最终的提交 / 回滚。
    • 关键:RM持有 XID+BID,只和 TC 交互,和 TM 无直接指令交互。

✅ 二、订单 + 扣钱 完整分布式事务执行流程(按你的场景,一步不差)

前提

  • order 和 account 都引入了 Seata 客户端、配置了 TC 地址;
  • order 有@GlobalTransactional,是 TM+RM;account 无注解,纯 RM;
  • 所有 XID 的透传、绑定、分支注册,全是 Seata 自动做,业务代码无感知

完整步骤

  1. TM(order)生成 XID + 注册全局事务:执行@GlobalTransactional的创建订单方法,Seata 本地生成唯一 XID,绑定到 order 的线程上下文,然后向 TC 注册「这个 XID 的全局事务」,TC 记录这个 XID 的全局事务状态为「执行中」。
  2. TM(order)作为 RM,执行本地分支:order 执行「创建订单」的 SQL,Seata 拦截 SQL,发现线程上下文有 XID → 自动向 TC 注册分支,TC 生成BID1并返回 → order 执行创建订单 + 生成 undo_log,完成第一个分支的预执行。
  3. XID 自动透传至 account:order 远程调用 account 的扣钱接口,Seata 的 Feign 拦截器自动从线程上下文拿 XID,塞进请求头;account 收到请求后,Seata 的 MVC 拦截器自动从请求头提取 XID,绑定到 account 自己的线程上下文。
  4. RM(account)注册分支 + 执行业务:account 执行「扣钱」的 SQL,Seata 拦截 SQL,发现线程上下文有 XID→ 判定自己是分布式事务的一员,自动向 TC 注册分支,TC 生成BID2并返回 → account 执行扣钱 + 生成 undo_log,完成第二个分支的预执行。✅ 核心判断逻辑:RM 只认「线程上下文 RootContext 里有没有有效 XID」,有就走分布式事务逻辑,没有就直接放行走普通本地事务
  5. TM(order)发起全局指令:order 的业务方法执行完毕(无异常 = 提交,有异常 = 回滚),只携带XID向 TC 发起「全局提交 / 回滚」请求,全程不带任何 BID。
  6. TC 总控协调所有 RM:TC 拿到 XID 后,找到这个 XID 绑定的所有 BID(BID1+BID2),分别向 order、account 下发「分支提交 / 回滚」指令(指令里带 XID+BID)。
  7. 所有 RM 执行最终操作:order 和 account 收到 TC 的指令后,根据 XID+BID 执行最终的提交(删除 undo_log)或回滚(根据 undo_log 恢复数据),执行完后向 TC 汇报结果,TC 更新全局事务状态,整个分布式事务结束。

✅ 三、你问的 2 个核心安全问题(精准答案,无多余)

问题 1:万一有人往 context 里放一个混乱的无效 XID怎么办?

完全无效,直接被拦截,Seata 有两层校验:

  1. 第一层:本地快速校验 XID 格式,混乱的字符串(比如abc@123)不符合 Seata 的 XID 格式规范,直接判定无效,跳过分布式事务逻辑,走普通本地事务;
  2. 第二层:就算格式像真的,向 TC 注册分支时,TC 里没有这个 XID 的全局事务记录,直接返回失败,RM 抛异常,分支注册失败,业务要么回滚要么走本地逻辑。

问题 2:万一有人往 context 里放一个真实有效的、但不是当前事务的 XID怎么办?

能注册分支,但完全无影响,数据绝对安全,核心原因 3 个:

  1. TC 只会给「处于执行中」的 XID 注册分支,若这个 XID 已经提交 / 回滚 / 超时,直接注册失败;
  2. 就算注册成功,这个错配的分支,只会收到「原 XID 对应的 TM」的指令,和当前事务毫无关系,当前事务的提交 / 回滚指令不会下发给它;
  3. 兜底:分支和业务是强绑定的,错配的分支执行的还是「当前扣钱 / 创建订单」的业务,就算被回滚,也只是当前业务执行失败,不会篡改任何其他业务的数据,数据一致性不受影响。

✅ 四、核心关键结论(所有重点浓缩,背下来就行)

  1. 角色:order=TM+RM,account=RM,Seata Server=TC;
  2. ID 归属:XID 由 TM 本地生成,BID 由 TC 统一分配;TM 只拿 XID,RM 拿 XID+BID;
  3. 核心判断:RM 靠「线程上下文有没有 XID」判断是否参与分布式事务,有则走 Seata 逻辑,无则放行;
  4. 交互关系:TM 只和 TC 交互(XID),RM 只和 TC 交互(XID+BID),TM 和 RM 之间无任何事务指令交互,只传业务参数;
  5. 安全兜底:无论注入什么 XID,都无法篡改数据,最多导致当前业务执行失败,无一致性风险。

✅ 五、补充 2 个你大概率会问的细节(提前给你,省得再问)

细节 1:同一个服务能既是 TM 又是 RM 吗?

能!就是你的订单服务,这是Seata 最常见的场景:分布式事务的入口服务,既发起全局事务(TM),又执行本地的资源操作(RM)。

细节 2:如果 account 自己调用自己的接口,没有 XID 会怎样?

account 的线程上下文没有 XID,Seata 不会拦截,扣钱逻辑走普通的本地数据库事务,和 Seata 无关,完全正常执行。


最后给你一个极简口诀,能把所有逻辑串起来:TM 生 XID,TC 发 BID;RM 看 XID,有则跟 TC;TM 只传 XID,TC 管所有 BID;全程自动化,业务无感知✔️

http://www.rkmt.cn/news/181492.html

相关文章:

  • 不用反复切号、不用守点熬夜!小红书多号运营的轻松玩法
  • Java 环境变量中 bin 与 lib 的由来
  • CentOS-Stream-10 搭建FTP服务器之虚拟用户访问(一)
  • 日语二类动词如何变化
  • JupyterLab远程开发配置:Miniconda-Python3.9镜像实操记录
  • HTML可视化调试利器:Miniconda-Python3.9集成Plotly开发实战
  • Anaconda配置PyTorch环境变量的正确姿势
  • Anaconda配置PyTorch时出现UnsatisfiableError怎么办?
  • ASP.NET Core 中 IHostedService 构造函数未被调用的排查与解决
  • Miniconda-Python3.9镜像如何提升你的AI开发效率?
  • 清华源加速pip安装!Miniconda-Python3.9镜像配置国内源教程
  • Conda create虚拟环境命名规范与最佳实践
  • Markdown文档编写+代码执行:Miniconda-Jupyter一体化工作流
  • 2025 MBA必备!10个AI论文软件测评:开题报告写作全攻略
  • 成人无人机技能培训服务哪家可靠?口碑好的成人无人机技能培训哪家强? - 工业设备
  • 2026年厂房管道安装工程承包商推荐:五家专业公司综合对比与选择指南 - 品牌2025
  • 一般通过什么软件收集、分析和可视化数据?
  • 国产镀层测厚仪靠谱生产厂家,常见品牌有哪些推荐? - 品牌推荐大师
  • 融合CBMA注意力机制的TCN-SVM故障诊断模型,江南大学、西储大学轴承数据为例---MATLAB代码
  • 厂房恒温恒湿工程设计施工一体化承包推荐:2026年优质选择指南 - 品牌2025
  • 2026年精密制造厂房恒温恒湿工程,专业团队如何选择? - 品牌2025
  • 吃透Java反射(面试必看)
  • HTML动态图表展示:Miniconda环境下使用Bokeh实战
  • 漏洞挖掘指南:小白进阶实战「数字侦探」,月入 3 万核心技能全解析
  • 元旦福利变现指南,永辉超市购物卡高效回收攻略 - 京顺回收
  • X1500型双轴撕碎机结构设计
  • 实用程序:Python打造进程网络监控与分析工具——全方位掌握你的网络与进程状态
  • 2025年成都靠谱西餐培训学校排行榜,新测评精选学做西餐培训学校推荐 - myqiye
  • 多工作台石材切机设计
  • SRC视角下:渗透测试中的逻辑漏洞思路一览,黑客技术零基础入门到精通实战教程!