Seata客戶端@GlobalTransactional核心源碼解析

文章目錄

  • 前言
  • 一、@GlobalTransactional
    • 1.1、wrapIfNecessary
    • 1.2、handleGlobalTransaction
    • 1.3、invoke
  • 二、總結


前言

??Seata是阿里開源的分布式事務解決方案。在Spring傳統的事務中,開啟事務,執行事務,回滾/提交事務,統一由Spring進行管理,向數據庫發起指令。而分布式事務中,分為了客戶端(微服務端)和服務端(Seata)、注冊中心(通常使用Nacos)這三個部分。Nacos提供了服務注冊與發現,以及管理Seata配置的作用。無論是開啟事務,執行事務,還是提交事務,都不是單個微服務內部自己決定的,而是統一向服務端發起請求,由服務端進行一系列的處理后,再向微服務端發起請求,驅動微服務端執行操作。


一、@GlobalTransactional

??對于微服務端,通常會在分布式事務的入口方法,加上@GlobalTransactional注解,表示該服務在分布式事務中作為TM的角色。微服務端的源碼解析,自然要從該注解開始。
??在注解的注釋上,標注了三個關鍵方法:
在這里插入圖片描述

1.1、wrapIfNecessary

??使用Seata,在微服務端需要引入一個依賴:

        <!-- seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

??通過自動配置機制,可以找到Seata客戶端的核心類:
在這里插入圖片描述
??在這個類中,裝配了兩個Bean:

  • FailureHandler:用于處理事務開始,執行,提交/回滾失敗的情況,留給子類實現,發送郵件或通知告警。默認的實現DefaultFailureHandlerImpl則是進行日志記錄。
  • GlobalTransactionScanner:是Seata的全局事務掃描器。

在這里插入圖片描述
??GlobalTransactionScanner繼承自AbstractAutoProxyCreator,重寫了其關鍵方法wrapIfNecessary
在這里插入圖片描述
??在wrapIfNecessary方法中,首先會判斷當前模式是否為TCC,如果是TCC模式,創建TccActionInterceptor攔截器并設置清理任務,同時監聽配置中心的開關DISABLE_GLOBAL_TRANSACTION
在這里插入圖片描述
??否則就是AT模式,會檢查目標類上是否存在@GlobalTransactional或方法上是否存在@GlobalTransactional@GlobalLock注解,如果存在,使用GlobalTransactionalInterceptor來代理。
在這里插入圖片描述
??因為GlobalTransactionalInterceptor實現了MethodInterceptor接口,所以將創建出的GlobalTransactionalInterceptor實例賦值給MethodInterceptor類型的interceptor屬性:
在這里插入圖片描述


??判斷是否存在@GlobalTransactional@GlobalLock注解,這一步非常關鍵,如果判斷不通過,該類就不會做和Seata有關的增強。
在這里插入圖片描述
existsAnnotation


??如果該Bean沒有被代理過,則調用父類方法創建代理。如果已經是AOP代理,則動態插入Seata的Advisor。
在這里插入圖片描述
??在super.wrapIfNecessary中,有一行關鍵代碼getAdvicesAndAdvisorsForBean,目的是獲取該 bean 適用的增強(Advice)或攔截器(Advisor),在Seata中選擇圖上的實現:

在這里插入圖片描述
??如果是普通全局事務,就使用GlobalTransactionalInterceptor增強目標方法,執行其invoke方法。

在這里插入圖片描述

wrapIfNecessary方法在Spring啟動時,判斷是否需要為 Bean 創建事務代理,并注入相應的攔截器(TCC 或 AT 模式)。

1.2、handleGlobalTransaction

??在1.1中,創建了GlobalTransactionalInterceptor的對象,其實現了MethodInterceptor
在這里插入圖片描述
??在重寫了MethodInterceptorinvoke方法中,如果當前方法上存在@GlobalTransactional注解,則會調用到handleGlobalTransaction方法:
在這里插入圖片描述
??在handleGlobalTransaction方法中,首先會執行transactionalTemplateexecute方法:
在這里插入圖片描述
??在執行execute方法的過程中,可能會發生異常,handleGlobalTransaction捕捉到異常后,會進行判斷,如果當前是事務的參與者,也就是RM,則繼續向上拋出異常,如果是事務的發起者TM,則解析出異常的code,執行各自失敗的邏輯(SeataAutoConfiguration中注入的FailureHandler的邏輯)。
在這里插入圖片描述
??這里的TransactionalTemplate,是seata的實現:在這里插入圖片描述
??在execute方法中,首先會進行事務傳播級別的判斷,是否應該新開啟一個事務,掛起當前事務等操作:Seata 的傳播級別與 Spring 的傳播語義一致,但實現機制完全不同,Spring 操作本地事務,Seata 操作的是全局分布式事務上下文。

在這里插入圖片描述
??然后就會執行一套標準的事務流程:開啟事務,執行事務,提交/回滾。
在這里插入圖片描述

handleGlobalTransaction 方法代表了事務執行的整體流程。

1.3、invoke

??invoke是在AOP攔截到對原始DataSource的調用時,將調用路由到Seata的代理DataSource上,使得數據庫連接支持全局事務的上下文控制。

  1. 判斷攔截的方法是否為javax.sql.DataSource接口中定義的方法。
  2. 獲取當前原始的DataSource,從DataSourceProxyHolde中獲取其對應的SeataDataSourceProxy,最終將方法調用代理到 SeataDataSourceProxy 上。

在這里插入圖片描述

Seata 使 SeataDataSourceProxy來增強連接的行為,如記錄 UndoLog,綁定 XID,向 TC 注冊分支事務

二、總結

Spring 容器啟動時

  • GlobalTransactionScanner 會掃描所有 bean 的方法是否包含@GlobalTransactional@GlobalLock注解。
  • 如果有,就為該方法添加一個 AOP Advisor,代理增強邏輯就是 GlobalTransactionalInterceptor

方法執行時

  • Spring AOP 會調用 GlobalTransactionalInterceptor#invoke()
  • Seata 會根據事務傳播級別、當前事務上下文,決定是否發起或加入全局事務。
  • 正常執行業務邏輯(調用 invocation.proceed())。
  • 執行完畢后:
    • 如果方法正常返回,Seata 提交全局事務;
    • 如果方法拋出異常,Seata 回滾事務

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79212.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pytorch搭建并訓練神經網絡

#從小白開始學習人工智能# #學習筆記# 工具&#xff1a;pytorch 一、基礎概念 1.神經網絡是什么&#xff1f; 神經網絡是人類受到生物神經細胞結構啟發而研究出的算法體系。又稱為人工神經網絡&#xff08;Artificial neural network&#xff09; 最簡版神經網絡結構圖&a…

JavaEE-多線程實戰01

Java 多線程入門&#xff1a;第一個多線程程序 在 Java 中&#xff0c;多線程編程是非常重要的一部分。本篇文章將通過示例&#xff0c;帶你快速了解如何創建第一個多線程程序&#xff0c;并深入分析其運行機制。 1. 創建一個線程類并繼承 Thread 在 Java 中&#xff0c;我們…

Android Compose 無網絡狀態處理全指南:從基礎到高級實踐

Android Compose 無網絡狀態界面處理全方案 引言 在移動應用開發中&#xff0c;網絡連接不穩定是常見場景。優雅地處理無網絡狀態能顯著提升用戶體驗。Jetpack Compose 提供了強大的工具來實現各種網絡狀態下的界面展示。本文將全面介紹在 Compose 中處理無網絡狀態的多種方案…

Arduino項目實戰與編程技術詳解

一、智能避障小車:超聲波傳感器與PWM電機控制 1.1 硬件需求與工作原理 智能避障小車的核心在于超聲波傳感器與電機驅動模塊的協同工作。超聲波傳感器(HC-SR04)通過發射高頻聲波并接收回波來測量距離,而L298N電機驅動模塊則負責控制兩個直流電機的轉向與速度。 1.1.1 超聲…

Java在云計算、大數據、云原生下的應用和優勢 - 面試實戰

Java在云計算、大數據、云原生下的應用和優勢 - 面試實戰 第一輪提問 面試官&#xff1a;馬架構&#xff0c;請簡單介紹一下Java在云計算中的主要應用場景有哪些&#xff1f; 馬架構&#xff1a;Java在云計算中的主要應用場景包括微服務架構設計、容器化部署&#xff08;如D…

數據庫與大數據技術教程資料

概述 無論你是剛入門的技術新人&#xff0c;還是尋求突破的資深工程師&#xff0c;這份精心整理的電子書合輯將為你打開系統性學習的大門&#xff01;所有資源支持多端閱讀&#xff0c;助力技術成長每一步資料已經整理好&#xff0c;喜歡的朋友請自取&#xff1a;https://pan.…

【Spring Boot 注解】@ConfigurationProperties

文章目錄 ConfigurationProperties注解一、簡介二、依賴引入三、基本用法四、主要特性五、激活方式六&#xff0c;優點七、與 Value 對比 ConfigurationProperties注解 一、簡介 ConfigurationProperties 是 Spring Boot 提供的一個強大注解&#xff0c;用于將外部配置&#…

C++(初階)(十六)——set

set setset介紹set的構造和迭代器set的增刪查findlower_boundmultiset和set的差異 題目[349. 兩個數組的交集 - 力扣&#xff08;LeetCode&#xff09;](https://leetcode.cn/problems/intersection-of-two-arrays/description/)交集差集[142. 環形鏈表 II - 力扣&#xff08;L…

higress之:讓流量通過gateway

本來想測跨域問題&#xff0c;結果參數配置過去之后一直沒生效&#xff0c;經過了解說是gateway才是設置跨域參數的核心&#xff0c;所以需要讓流量通過gateway&#xff0c;搗鼓了半天記錄一下 第一步&#xff0c;測試服務是否正常 通過get svc、pod等&#xff0c;發現各pod都…

C盤哪些文件刪除之后無影響,可以清理磁盤空間。

C盤是電腦的系統盤,存放了操作系統的重要文件和部分默認安裝的軟件。當C盤空間不足時,系統可能運行緩慢甚至卡頓,這時清理C盤是一個有效的解決方法。由于C盤包含許多關鍵數據,清理時需要格外謹慎,以免誤刪導致系統崩潰。將詳細介紹C盤中可以安全刪除的文件類型及清理方法,…

開源項目實戰學習之YOLO11:ultralytics-cfg-models-fastsam(九)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 1. __init__.py2. model.py3. predict.py4. utils.py5. val.py FastSAM 是一種目標檢測和圖像分割模型&#xff0c;Ultralytics 是一個在計算機視覺領域廣泛使用的庫&#x…

Windows11安裝Docker

本次安裝環境 Windows11&#xff08;23H2&#xff09;&#xff0c;CPU&#xff08;12代Intel&#xff09; 什么是Docker Docker 是一個軟件平臺&#xff0c;讓您可以快速構建、測試和部署應用程序。Docker 將軟件打包成名為容器的標準化單元&#xff0c;這些單元具有運行軟件所…

C# 在VS2022中開發常用設置

一、基礎環境配置 1. 安裝必要組件 在 VS2022 安裝時確保勾選以下工作負載&#xff1a; ??使用 .NET 的桌面開發??&#xff08;包含 WPF/WinForms&#xff09;??ASP.NET 和 Web 開發????.NET 跨平臺開發????Azure 開發????數據存儲和處理?? 2. 主題與外…

k8s的volume

一、volume介紹 volume是Pod中能夠唄多個容器訪問的共享目錄。Kubernetes的Volume概念、用途和目的與Docker的Volume比較類似,但兩者不能等價。首先,Kubernetes中的Volume定義在Pod上,然后被一個Pod里的多個容器掛載到具體的文件目錄下;其次,Kubernetes中的Volume與Pod的生…

Java 未來技術棧:從云原生到 AI 融合的企業級技術演進路線

一、云原生架構&#xff1a;重構 Java 應用的運行范式 1.1 微服務架構的深度進化 Java 在微服務領域的實踐正從 Spring Cloud 向服務網格&#xff08;Service Mesh&#xff09;演進。以 Istio 為代表的服務網格技術&#xff0c;通過 Sidecar 模式實現服務間通信的透明化管理&…

阿里云 ECS 服務器進階指南:存儲擴展、成本優化與架構設計

一、彈性存儲架構&#xff1a;塊存儲深度解析與掛載實踐 &#xff08;一&#xff09;塊存儲類型與技術特性 阿里云塊存儲作為 ECS 核心存儲方案&#xff0c;提供三種主流類型&#xff1a; ESSD 云盤 性能等級&#xff1a;PL0/PL1/PL2/PL3&#xff0c;最高支持 100 萬 IOPS …

centos 安裝jenkins

centos 安裝jenkins 在 CentOS 上安裝 Jenkins 是一個相對直接的過程。以下是一個逐步指南&#xff0c;幫助你安裝 Jenkins&#xff1a; 步驟 1&#xff1a;安裝 Java Jenkins 需要 Java 運行環境&#xff0c;因此首先確保你的系統上安裝了 Java。你可以使用以下命令來安裝 …

十三種物聯網/通信模塊綜合對比——《數據手冊--物聯網/通信模塊》

物聯網&#xff0f;通信模塊 名稱 功能 應用場景 USB轉換模塊 用于將USB接口轉換為其他類型的接口&#xff0c;如串口、并口等&#xff0c;實現不同設備之間的通信。 常用于計算機與外部設備&#xff08;如打印機、掃描儀等&#xff09;的連接&#xff0c;以及數據傳輸和設…

【基礎知識】常見的計算公式(二)

目錄標題 一、ADC&#xff08;模擬 - 數字轉換器&#xff09;相關公式1. ADC 分辨率計算2. ADC 轉換結果對應的模擬電壓計算 二、DAC&#xff08;數字 - 模擬轉換器&#xff09;相關公式1. DAC 輸出電壓計算 三、SPI&#xff08;串行外設接口&#xff09;相關公式1. SPI 數據傳…

DeepSeek V1:初代模型的架構與性能

DeepSeek V1(又稱DeepSeek-MoE)是DeepSeek系列的首代大規模語言模型,它采用Transformer結合稀疏混合專家(MoE)的創新架構,實現了在受控算力下的大容量模型。本文將深入解析DeepSeek V1的架構設計與技術細節,包括其關鍵機制、訓練優化策略,以及在各類NLP任務上的表現。 …