分布式事務,事務失效,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.pswp.cn/web/77944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77944.shtml
英文地址,請注明出處:http://en.pswp.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; 快速建立故障診斷工作區收集關鍵系統指標分…