[特殊字符] 分布式事務中,@GlobalTransactional 與 @Transactional 到底怎么配合用?

在微服務架構中,隨著系統模塊的拆分,單體應用中的本地事務已經無法滿足跨服務的數據一致性需求。此時,我們就需要引入分布式事務解決方案,比如 Seata。在使用 Seata 的過程中,很多人會遇到一個常見的疑問:

💬“我在調用方加了 @GlobalTransactional,服務提供方還需要加 @Transactional 嗎?”

答案是:必須要加!

這篇文章我們就深入講清楚:為什么服務提供方還需要加 @Transactional,以及兩者如何協作實現真正可靠的分布式事務。


🧩 一、事務的兩種類型

在討論這個問題之前,我們先要明確兩個事務注解的含義。

? 1. @GlobalTransactional(Seata 分布式事務)
  • 加在調用方法上,表示開啟一個全局事務

  • 屬于 Seata 的 AT 模式 事務注解,由 Seata 的 Transaction Coordinator (TC) 負責協調。

  • 它會自動傳播全局事務上下文給遠程調用的服務。

? 2. @Transactional(Spring 本地事務)
  • 加在某個服務的方法上,表示方法內部的數據庫操作需要 在同一個本地事務中進行

  • 只有方法內部的操作在同一個本地事務中,Seata 才能在全局事務失敗時,正確地讓這些操作回滾。


📌 二、真實業務場景還原

我們以一個真實的訂單系統為例:

👇 業務流程:
  1. 用戶在訂單服務(A)中下單。

  2. 系統同時調用庫存服務(B)扣減庫存。

  3. 庫存服務還會記錄一條扣減日志到另一個表。

? 錯誤示范(服務B沒加 @Transactional):
// A服務
@GlobalTransactional
public void createOrder() {orderMapper.insert(order);inventoryFeign.decreaseStock(); // 遠程調用 B 服務
}
// B服務
public void decreaseStock() {stockMapper.decrease();   // 成功logMapper.insertLog();    // 失敗,拋異常
}

這時候會發生什么?

  • A服務使用 @GlobalTransactional,Seata 啟動了全局事務。

  • B服務沒有使用 @Transactional,所以兩個表的操作并不在同一個本地事務中

  • 如果 logMapper.insertLog() 拋出異常,雖然 Seata 會通知回滾,但由于 stockMapper.decrease() 已經提交,數據就不一致了!

? 正確示范(服務B加上 @Transactional):
// B服務
@Transactional
public void decreaseStock() {stockMapper.decrease();   // 與下方操作屬于同一個本地事務logMapper.insertLog();
}

現在當 logMapper.insertLog() 拋出異常時:

  • Spring 會將整個 decreaseStock 方法回滾。

  • Seata 能檢測到異常,通知所有參與者事務回滾。

  • 整個流程變成原子性的。


🔍 三、Seata 的本質:全局事務 + 本地事務協同

Seata 做的不是“接管”你的數據庫事務,而是:

在每個服務節點中使用代理數據源(DataSourceProxy),通過攔截本地事務的提交/回滾操作,來實現 全局的一致性控制

因此:

  • @GlobalTransactional 控制“何時開始、是否提交全局事務”

  • @Transactional 保證“本地數據庫操作的一致性和可回滾性”

你不加 @Transactional,Seata 就沒法讓你的數據庫事務回滾,因為根本沒事務!


🛠 四、項目接入建議

如果你要使用 Seata 進行分布式事務控制,務必注意以下幾點:

配置項說明
? @GlobalTransactional放在業務流程發起方(一般是 Controller 或 Service)
? @Transactional放在服務提供方處理數據庫操作的 Service 方法上
? 使用 Seata 的 DataSourceProxy所有數據源都要通過 Seata 的代理包裝
? 注冊到 Seata Server服務注冊中心需正確配置 Seata 服務

📚 五、總結

@GlobalTransactional 是分布式事務的起點,@Transactional 是本地事務的保障,二者缺一不可。

在微服務的世界里,要實現數據一致性,必須讓每個參與者都對自己的事務負責。Seata 會協調所有本地事務的提交和回滾,但它不會、也無法替你加上事務控制。


如果你覺得這篇文章對你有幫助,歡迎點贊、評論、收藏 ?
有任何問題也歡迎私信或留言交流!


📌 附推薦閱讀:

  • Seata 官方文檔

  • Spring Transactional 源碼解析

  • [分布式事務解決方案對比(Seata、TCC、消息最終一致性)]

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

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

相關文章

TDengine 集群高可用方案設計(二)

四、TDengine 集群高可用方案設計 4.1 硬件與網絡架構設計 服務器選型:選擇配置高、穩定性強的服務器,如戴爾 PowerEdge R740xd、華為 RH2288H V5 等。以戴爾 PowerEdge R740xd 為例,它配備英特爾至強可擴展處理器,具備高性能計…

從對數變換到深度框架:邏輯回歸與交叉熵的數學原理及PyTorch實戰

目錄 前言 一、連乘變連加二、最小化損失函數2.1交叉熵2.2 二分類交叉熵2.3 多分類交叉熵三、邏輯回歸與二分類3.1 邏輯回歸與二分類算法理論講解3.1.1 散點輸入3.1.2 前向計算3.1.3 Sigmoid函數引入3.1.4 參數初始化3.1.5 損失函數3.1.6 開始迭代3.1.7 梯度下降顯示四、基于框…

高企復審獎補!2025年合肥市高新技術企業重新認定獎勵補貼政策及申報條件

一、合肥市高新技術企業重新認定獎勵補貼政策 (一)高新區高新技術企業重新認定復審補貼獎勵 重新認定為國家高新技術企業的給予5萬元一次性獎勵。 (二)經開區高新技術企業重新認定復審補貼獎勵 對重新認定的企業,給…

Spring Boot 中配置線程池時優化 `ThreadPoolTaskExecutor` 的配置總結

在 Spring Boot 中配置線程池時,可以通過以下方式進一步優化 ThreadPoolTaskExecutor 的配置,提升性能、靈活性和可靠性: 優化點 1:合理設置線程池參數 關鍵參數調整 Bean(name "taskExecutor") public Executor tas…

opencv 圖像的旋轉

圖像的旋轉 1 單點旋轉2. 圖片旋轉(cv2.getRotationMatrix2D)3. 插值方法3.1 最近鄰插值(cv2.INTER_NEAREST)3.2 雙線性插值(cv2.INTER_LINEAR)3.3 像素區域插值(cv2.INTER_AREA)3.4 雙三次插值(cv2.INTER_CUBIC&#…

如何在 Odoo 18 中配置自動化動作

如何在 Odoo 18 中配置自動化動作 Odoo是一款多功能的業務管理平臺,旨在幫助各種規模的企業更高效地處理日常運營。憑借其涵蓋銷售、庫存、客戶關系管理(CRM)、會計和人力資源等領域的多樣化模塊,Odoo 簡化了業務流程&#xff0c…

每日兩道leetcode

345. 反轉字符串中的元音字母 - 力扣(LeetCode) 題目 給你一個字符串 s ,僅反轉字符串中的所有元音字母,并返回結果字符串。 元音字母包括 a、e、i、o、u,且可能以大小寫兩種形式出現不止一次。 示例 1:…

【SQL 基礎入門 1. -- SQL 基本語法詳解及舉例】

文章目錄 SQL 數據庫創建及使用刪除數據庫SQL 查看數據空中有哪些表格SQL 創建表格SQL 修改表格列數據格式SQL 表格插入數據SQL 查看表格類型組成SQL 查看表格中的內容 SQL 查詢語句SQL 查看指定列SQL 選擇指定列SQL 按指定列進行升序排序SQL 平均值/求和/最大值/最小值 SQL 數…

PostgreSQL 分區表——范圍分區SQL實踐

PostgreSQL 分區表——范圍分區SQL實踐 1、環境準備1-1、新增原始表1-2、執行腳本新增2400w行1-3、創建pg分區表-分區鍵為創建時間1-4、創建24年所有分區1-5、設置默認分區(兜底用)1-6、遷移數據1-7、創建分區表索引 2、SQL增刪改查測試2-1、查詢速度對比…

Apache Flink 深度解析:流處理引擎的核心原理與生產實踐指南

Apache Flink 深度解析:流處理引擎的核心原理與生產實踐指南 引言:實時計算的范式革命 2023年雙十一期間,某頭部電商平臺基于Flink構建的實時風控系統成功攔截了每秒超過120萬次的異常交易請求。這背后是Apache Flink作為第四代計算引擎的強…

【Java學習筆記】選擇結構

選擇結構 內容結構 一、順序結構 二、分支控制 (1)單分支 (2)雙分支 (3)多分支 (4)嵌套分支 (5)switch 分支結構 三、switch和if的比較 一、順序結構…

03_JavaScript

文章目錄 一、概述1.1、JavaScript簡介1.2、JavaScript組成部分1.3、為什么要學習JavaScript1.4、學習的目的1.5、JavaScript與Java的關系 二、使用位置及運行說明2.1、使用位置2.2、如何運行 三、JavaScript基礎語法3.1、變量3.2、運算符3.3、控制流程3.3.1、分支結構3.3.2、循…

PySide6 GUI 學習筆記——常用類及控件使用方法(常用類矩陣QRect)

文章目錄 一、構造與初始化方法二、坐標與尺寸獲取三、坐標與尺寸設置四、幾何運算方法五、移動與調整方法六、狀態判斷方法七、類型轉換方法八、操作符重載九、靜態方法十、特殊方法附錄方法速查表注意的問題交集和并集圖解 📘 PySide6.QtCore.QRect 使用整數精度定…

AI 開發入門之 RAG 技術

目錄 一、從一個簡單的問題開始二、語言模型“閉卷考試”的困境三、RAG 是什么—LLM 的現實世界“外掛”四、RAG 的七步流程第一步:加載數據(Load)第二步:切分文本(Chunking)第三步:向量化&…

解決yarn install 報錯 error \node_modules\electron: Command failed.

在電腦重裝系統后,重新安裝項目依賴,遇到這一報錯 完整報錯信息如下: error D:\xxxxx\xxxxxx\node_modules\electron: Command failed. Exit code: 1 Command: node install.js Arguments: Directory: D:\xxxxx\xxxxx\node_modules\electron Output: HTTPError: Response cod…

2025年3月電子學會青少年機器人技術(五級)等級考試試卷-理論綜合

青少年機器人技術等級考試理論綜合試卷(五級) 分數:100 題數:30 一、單選題(共20題,共80分) 1. 2025年初,中國科技初創公司深度求索在大模型領域迅速崛起,其開源的大模型成為全球AI領域的焦…

23種設計模式-行為型模式之模版方法模式(Java版本)

Java 模板方法模式(Template Method Pattern)詳解 🧠 什么是模板方法模式? 模板方法模式是一種行為型設計模式,在一個方法中定義一個操作中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在…

長城杯鐵人三項初賽-REVERSE復現

前言 記錄記錄 1.LoginToMe int __fastcall main(int argc, const char **argv, const char **envp) {unsigned int v3; // eaxchar s[96]; // [rsp10h] [rbp-70h] BYREFint v6; // [rsp70h] [rbp-10h]int v7; // [rsp78h] [rbp-8h]int i; // [rsp7Ch] [rbp-4h]memset(s, 0, s…

DNS實驗

DNS原理 客戶端發起請求:客戶端向本地 DNS 服務器發送域名解析請求,這是流程的起始點。本地 DNS 服務器查詢根域名服務器:若本地 DNS 服務器緩存中無對應記錄,它向根域名服務器發起查詢,根域名服務器是 DNS 系統頂層&a…

SQLMesh 通知系統深度解析:構建自動化監控體系

SQLMesh 是一款強大的數據編排工具,其內置的靈活通知系統可顯著提升團隊協作效率。本文將系統解讀 SQLMesh 的通知機制,涵蓋配置方法、事件觸發邏輯及高級定制技巧。 一、通知系統的核心架構 1. 通知目標(Notification Targets) …