分布式事务,事务失效,TC事务协调者


1. 概述

本方案书旨在解决分布式系统中事务一致性问题,重点阐述全局事务标识(XID)的传递与存储机制、事务协调者(TC)的设计与部署,以及分布式事务失效场景的应对策略。基于业界成熟框架(如Seata)的最佳实践,提供高可用、高性能的分布式事务解决方案。


2. 核心概念与架构

2.1 分布式事务模型

  • AT模式(自动补偿)
    通过全局锁和逆向SQL(undo log)实现自动回滚,适用于数据库操作。
  • TCC模式(手动补偿)
    业务层实现Try-Confirm-Cancel接口,适用于复杂业务逻辑。
  • Saga模式(长事务)
    通过事件驱动和补偿事务链实现最终一致性,适用于跨服务长流程。

2.2 核心组件

组件角色
事务协调者(TC)独立服务,负责全局事务状态管理和协调。
事务管理器(TM)集成在业务服务中,负责开启/提交/回滚全局事务。
资源管理器(RM)管理本地资源(如数据库、消息队列),执行分支事务的提交/回滚。

3. XID 的传递与存储机制

3.1 XID 的生成与作用

  • 全局唯一性:由TC生成,格式示例:192.168.1.100:8091:123456
  • 核心功能:关联所有分支事务,确保跨服务、跨资源的操作原子性。

3.2 XID 的传递方式

场景1:跨服务调用(RPC/HTTP)
  • 隐式传递(推荐)
    通过RPC框架(如Dubbo、Feign)的请求头自动传递XID。
    // Feign 拦截器示例  
    public class XidFeignInterceptor implements RequestInterceptor {  @Override  public void apply(RequestTemplate template) {  String xid = RootContext.getXID();  template.header("TX_XID", xid);  }  
    }  
    
场景2:异步任务与多线程
  • 手动传递(基础方案)
    显式传递XID并在子线程中绑定:
    String xid = RootContext.getXID();  
    executor.submit(() -> {  RootContext.bind(xid);  try {  // 业务逻辑  } finally {  RootContext.unbind();  }  
    });  
    
  • TransmittableThreadLocal(推荐)
    使用阿里开源工具解决线程池上下文传递问题:
    private static TransmittableThreadLocal<String> XID = new TransmittableThreadLocal<>();  
    executor.submit(TtlRunnable.get(() -> {  // 子线程自动继承XID  
    }));  
    
场景3:消息队列(如Kafka、RocketMQ)
  • 消息头传递
    生产者将XID写入消息属性,消费者读取后绑定到本地事务:
    // RocketMQ 生产者  
    Message msg = new Message();  
    msg.putUserProperty("XID", xid);  
    

3.3 XID 的存储管理

  • 默认存储:基于ThreadLocal,仅限当前线程访问。
    public class RootContext {  private static ThreadLocal<String> XID = new ThreadLocal<>();  
    }  
    
  • 扩展方案
    • InheritableThreadLocal:支持父子线程传递,但不适用于线程池。
    • TransmittableThreadLocal:支持线程池场景,需配合TtlRunnable使用。

4. 事务协调者(TC)的设计与部署

4.1 TC 的核心职责

  • 全局事务管理:注册XID,维护global_table(全局事务状态表)。
  • 分支事务协调:记录branch_table(分支事务表),驱动提交/回滚。
  • 故障恢复:检测超时事务,触发自动回滚或重试。

4.2 部署模式

独立服务部署(推荐)
  • 启动命令
    # Seata TC 服务启动  
    sh seata-server.sh -p 8091 -m db -h 192.168.1.100  
    
  • 高可用设计
    • 数据库模式:多个TC节点共享同一数据库(如MySQL)。
    • Raft模式:通过一致性协议实现集群选举(Seata 1.5+)。
配置文件示例(Seata)
# registry.conf  
registry {  type = "nacos"  nacos {  serverAddr = "localhost:8848"  namespace = ""  cluster = "default"  }  
}  config {  type = "nacos"  nacos {  serverAddr = "localhost:8848"  namespace = ""  group = "SEATA_GROUP"  }  
}  

4.3 事务恢复流程

  1. 回滚触发:TM通知TC回滚指定XID。
  2. 分支查询:TC从branch_table查询所有关联分支。
  3. 逆向执行:各RM根据undo_log执行补偿操作。

5. 分布式事务失效场景与解决方案

5.1 常见失效场景

场景原因后果
RPC调用未透传XID未在请求头中添加XID下游服务无法加入全局事务
异步任务未绑定XID子线程未继承ThreadLocal中的XID异步操作游离于事务外
TC单点故障未部署TC集群全局事务无法协调

5.2 解决方案

场景1:XID传递失败
  • 强制校验:在事务入口拦截请求,校验XID是否存在。
  • 统一拦截器:通过RPC拦截器(如Spring AOP)自动透传XID。
场景2:多线程XID丢失
  • TransmittableThreadLocal:结合线程池包装类(TtlExecutors)传递上下文。
  • 框架集成:Spring异步任务支持:
    @Configuration  
    @EnableAsync  
    public class AsyncConfig implements AsyncConfigurer {  @Override  public Executor getAsyncExecutor() {  return TtlExecutors.getTtlExecutor(Executors.newFixedThreadPool(4));  }  
    }  
    
场景3:TC单点故障
  • 集群部署:部署多个TC节点,通过Nacos或Raft协议实现高可用。
  • 健康检查:集成Prometheus监控TC节点状态。

6. 最佳实践与性能优化

6.1 最佳实践

  1. 避免跨事务异步操作:将异步任务放在事务边界外。
  2. 事务粒度控制:单个事务内操作不超过3个服务。
  3. 超时配置:全局事务超时时间建议为60秒,避免资源长时间锁定。

6.2 性能优化

  • 异步提交:Seata AT模式下,二阶段提交异步化(默认开启)。
  • 全局锁优化:减少热点数据竞争,使用SELECT ... FOR UPDATE时指定索引。

6.3 监控与日志

  • 监控指标
    • TC节点状态(活跃事务数、TPS)。
    • RM资源锁竞争情况。
  • 日志收集
    • 记录全局事务ID(XID)到ELK或SkyWalking,支持快速定位问题。

7. 附录

7.1 示例代码仓库

  • Seata 官方示例
  • TransmittableThreadLocal 使用指南

7.2 相关工具

  • Seata Dashboard:可视化监控全局事务状态。
  • Prometheus + Grafana:监控TC集群性能指标。

版本记录

  • v1.0(2023-10-01):初版发布,涵盖XID传递、TC设计、失效场景解决方案。
  • v1.1(2023-10-05):补充异步任务配置示例与性能优化建议。

评审人:技术委员会
批准人:CTO


:本方案书需结合具体业务场景调整,建议在预生产环境充分验证。

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

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

相关文章

2025年“深圳杯”数学建模挑战赛D题-法医物证多人身份鉴定问题

法医物证多人身份鉴定问题 小驴数模 犯罪现场法医物证鉴定是关系到国家安全、公共安全、人民生命财产安全和社会稳定的重大问题。目前法医物证鉴定依赖DNA分析技术不断提升。DNA检验的核心是STR&#xff08;Short Tandem Repeat&#xff0c;短串联重复序列&#xff09;分析技术…

Mysql查询异常【Truncated incorrect INTEGER value】

文章目录 异常原因分析1、数据类型不一致2、数据长度超长3、数据格式要正确 处理方案模拟案例创建表数据查询 异常 在执行MySQL的语句时&#xff0c;在控制台报错如下所示。 Data truncation: Truncated incorrect INTEGER value 原因分析 1、数据类型不一致 必须要保证数据…

WPF性能优化举例

WPF性能优化集锦 一、UI渲染性能优化 1. 虚拟化技术 ​​ListView/GridView虚拟化​​: <ListView VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"ScrollViewer.IsDeferredScrollingEnabled=…

C# 面向对象实例演示

C# 面向对象编程实例演示 一、基础概念回顾 面向对象编程(OOP)的四大基本特性&#xff1a; ​​封装​​ - 将数据和操作数据的方法绑定在一起​​继承​​ - 创建新类时重用现有类的属性和方法​​多态​​ - 同一操作作用于不同对象产生不同结果​​抽象​​ - 简化复杂系…

大连理工大学选修课——机器学习笔记(3):KNN原理及应用

KNN原理及应用 机器学习方法的分类 基于概率统计的方法 K-近邻&#xff08;KNN&#xff09;贝叶斯模型最小均值距离最大熵模型条件随机场&#xff08;CRF&#xff09;隐马尔可夫模型&#xff08;HMM&#xff09; 基于判别式的方法 决策树&#xff08;DT&#xff09;感知机…

蒋新松:中国机器人之父

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 蒋新松:中国机器人之父 一、生平简介 1. 早年经历与求学道路 蒋新松出生于1931年8月3日,江苏省江阴澄北镇一个靠近长江的小镇。他的名字来源于杜…

表征(Representations)、嵌入(Embeddings)及潜空间(Latent space)

文章目录 1. 表征 (Representations)2. 嵌入 (Embeddings)3. 潜空间 (Latent Space)4. 关系总结5. 学习思考 1. 表征 (Representations) 定义: 表征是指数据的一种编码或描述形式。在机器学习和深度学习中&#xff0c;它特指模型在处理数据时&#xff0c;将原始输入数据转换成…

【STM32实物】基于STM32的RFID多卡识别语音播报系统设计

演示视频: 基于STM32的RFID多卡识别语音播报系统设计 前言:本项目可实现多个电子标签IC卡RFID识别,刷卡识别后进行中文语音播报反馈,同时进行控制对应的灯光开关。以此也可扩展开发更多功能。 本项目所需主要硬件包括:STM32F103C8T6最小系统板、RFID-RC522模块、五个IC电…

全面了解CSS语法 ! ! !

CSS&#xff08;层叠样式表&#xff09;是网页设计的灵魂之一&#xff0c;它赋予了网页活力与美感。无论是为一个简单的个人博客增添色彩&#xff0c;还是为复杂的企业网站设计布局&#xff0c;CSS都是不可或缺的工具。那么&#xff0c;CSS语法到底是什么样的呢&#xff1f;它背…

青少年抑郁症患者亚群结构和功能连接耦合的重构

目录 1 研究背景及目的 2 研究方法 2.1 数据来源与参与者 2.1.1 MDD患者&#xff1a; 2.1.2 健康对照组&#xff1a; 2.2 神经影像分析流程 2.2.1 图像采集与预处理&#xff1a; 2.2.2 网络构建&#xff1a; 2.2.3 区域结构-功能耦合&#xff08;SC-FC耦合&#xff09…

【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题

目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现 1.2 纯代码形式实现 1.3 使用 按钮 实现 1.3.1 图形化界面实现 1.3.2 纯代码形式实现 1.4 使用 编辑框 实现 1.4.1 图形化界面实现 1.4.2 纯代码形式实现 1.4.3 内存泄露 2. 认识对象模型&#xff08;对象树&…

在pycharm中创建Django项目并启动

Django介绍 Django 是一个基于 Python 的开源 Web 应用框架&#xff0c;采用了 MTV&#xff08;Model - Template - View&#xff09;软件设计模式 &#xff0c;由许多功能强大的组件组成&#xff0c;能够帮助开发者快速、高效地创建复杂的数据库驱动的 Web 应用程序。它具有以…

在Carla中构建自动驾驶:使用PID控制和ROS2进行路径跟踪

机器人软件开发什么是 P、PI 和 PID 控制器&#xff1f;比例 &#xff08;P&#xff09; 控制器比例积分 &#xff08;PI&#xff09; 控制器比例-积分-微分 &#xff08;PID&#xff09; 控制器横向控制简介CARLA ROS2 集成纵向控制横向控制关键要点结论引用 机器人软件开发 …

【KWDB 创作者计划】_深度解析KWDB存储引擎

文章目录 每日一句正能量引言一、存储引擎核心模块结构二、写前日志 WAL&#xff08;Write-Ahead Log&#xff09;三、列式压缩存储&#xff08;Columnar Compression&#xff09;四、索引机制与混合查询调度五、分布式核心功能&#xff1a;租约管理实战六、时间序列数据处理&a…

Apache Tomcat 漏洞(CVE-2025-24813)导致服务器面临 RCE 风险

CVE-2025-24813Apache Tomcat 中发现了一个严重安全漏洞,标识为,该漏洞可能导致服务器面临远程代码执行 (RCE)、信息泄露和数据损坏的风险。 此缺陷影响以下版本: Apache Tomcat11.0.0-M1通过11.0.2Apache Tomcat10.1.0-M1通过10.1.34Apache Tomcat9.0.0-M1通过9.0.98了解 …

全面解析SimHash算法:原理、对比与Spring Boot实践指南

一、SimHash算法概述 SimHash是一种局部敏感哈希算法&#xff0c;由Google工程师Moses Charikar提出&#xff0c;主要用于海量文本的快速去重与相似度检测。其核心思想是将高维特征向量映射为固定长度的二进制指纹&#xff08;如64位&#xff09;&#xff0c;通过计算指纹间的…

临床回归分析及AI推理

在医疗保健决策越来越受数据驱动的时代&#xff0c;回归分析已成为临床医生和研究人员最强大的工具之一。无论是预测结果、调整混杂因素、建模生存时间还是理解诊断性能&#xff0c;回归模型都为将原始数据转化为临床洞察提供了统计学基础。 AI推理 然而&#xff0c;随着技术…

西门子PLC S7-1200 电动机的软启动控制

1 PWM 控制的基本概念 PWM 是 PulseWidth Modulation 的简称。 PWM 控制是一种脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制来等效获得所需要的波形(含形状和幅值)。PWM 控制技术在逆变电路中应用比较广泛,所应用的逆变电路绝大部分是PWM 型。除此之外, PWM 控制技术…

【学习 python day5】

学习目标&#xff1a; python基础 掌握函数的定义及调用方法掌握模块的用法掌握包的用法掌握如何捕获异常 web自动化测试 能完成selenium自动化环境部署及结果验证掌握selenium实现自动化测试的核心步骤 学习内容&#xff1a; 一、Python基础 1、集合[了解] 1, 集合 set, …

day006-实战练习题-参考答案

老男孩教育-99期-实战练习题 1. 你作为"老男孩教育99期云计算"新晋运维工程师&#xff0c;在入职首日遭遇紧急事件&#xff1a; "生产环境3台Web服务器突发性能告警&#xff0c;技术总监要求你立即完成&#xff1a; 快速建立故障诊断工作区收集关键系统指标分…