Seate的XA模式和AT模式

目錄

一、XA模式

【1】兩階段提交

【2】Seata的XA模型

【3】優缺點

【4】實現XA模式

二、AT模式

【1】Seata的AT模型

【2】AT與XA的區別

【3】臟寫問題

【4】優缺點

【5】實現AT模式


一、XA模式

????????XA 規范 是 X/Open 組織定義的分布式事務處理(DTP,Distributed Transaction Processing)標準, XA 規范 描述了全局的TM與局部的RM之間的接口,幾乎所有主流的數據庫都對 XA規范提供了支持。


【1】兩階段提交

XA是規范,目前主流數據庫都實現了這種規范,實現的原理都是基于兩階段提交。

正常情況:

異常情況:

?階段:
  • 事務協調者通知每個事物參與者執行本地事務
  • 本地事務執行完成后報告事務執行狀態給事務協調者,此時事務不提交,繼續持有數據庫鎖
?階段:
  • 事務協調者基于?階段的報告來判斷下?步操作
    • 如果?階段都成功,則通知所有事務參與者,提交事務
    • 如果?階段任意?個參與者失敗,則通知所有事務參與者回滾事務

【2】Seata的XA模型

RM?階段的工作:
  • 注冊分支事務到TC
  • 執行分支業務sql但不提交
  • 報告執行狀態到TC
TC?階段的工作:
  • TC檢測各分支事務執行狀態
  • 如果都成功,通知所有RM提交事務
  • 如果有失敗,通知所有RM回滾事務

RM?階段的工作:
  • 接收TC指令,提交或回滾事務

【3】優缺點

XA模式的優點是什么?
  • 事務的強?致性,滿足ACID原則。
  • 常用數據庫都支持,實現簡單,并且沒有代碼侵?
XA模式的缺點是什么?
  • 因為?階段需要鎖定數據庫資源,等待?階段結束才釋放,性能較差
  • 依賴關系型數據庫實現事務

【4】實現XA模式

Seata的starter已經完成了XA模式的自動裝配,實現非常簡單,步驟如下:

1)修改application.yml文件(每個參與事務的微服務),開啟XA模式:

seata:data-source-proxy-mode: XA

2)給發起全局事務的入口方法添加@GlobalTransactional注解:

本例中是OrderServiceImpl中的create方法.

3)重啟服務并測試

重啟order-service,再次測試,發現無論怎樣,微服務都能成功回滾。


二、AT模式

AT模式同樣是分階段提交的事務模型,不過缺彌補了XA模型中資源鎖定周期過長的缺陷。

【1】Seata的AT模型

基本流程圖:

階段?RM的工作:

  • 注冊分支事務

  • 記錄undo-log(數據快照)

  • 執行業務sql并提交

  • 報告事務狀態

階段?提交時RM的工作:

  • 刪除undo-log即可

階段?回滾時RM的工作:

  • 根據undo-log恢復數據到更新前


【2】AT與XA的區別

簡述AT模式與XA模式最大的區別是什么?

  • XA模式?階段不提交事務,鎖定資源;AT模式?階段直接提交,不鎖定資源。

  • XA模式依賴數據庫機制實現回滾;AT模式利用數據快照實現數據回滾。

  • XA模式強?致;AT模式最終?致


【3】臟寫問題

在多線程并發訪問AT模式的分布式事務時,有可能出現臟寫問題,如圖:

????????解決思路就是引入了全局鎖的概念在釋放DB鎖之前,先拿到全局鎖,避免同?時刻有另外?個事務來操作當前數據。


【4】優缺點

AT模式的優點:
  • ?階段完成直接提交事務,釋放數據庫資源,性能比較好
  • 利用全局鎖實現讀寫隔離
  • 沒有代碼侵?,框架自動完成回滾和提交
AT模式的缺點:
  • 兩階段之間屬于軟狀態,屬于最終?致
  • 框架的快照功能會影響性能,但比XA模式要好很多

【5】實現AT模式

????????AT模式中的快照生成、回滾等動作都是由框架自動完成,沒有任何代碼侵入,因此實現非常簡單。 只不過,AT模式需要?個表來記錄全局鎖、另?張表來記錄數據快照undo_log。

1)導入數據庫表,記錄全局鎖

運行seata-at.sql,其中lock_table導入到TC服務關聯的數據庫,undo_log表導?到微服務關聯的數據庫:

2)修改application.yml文件,將事務模式修改為AT模式即可:
seata:data-source-proxy-mode: AT # 默認就是AT

3)重啟服務并測試


????????感謝你花時間讀到這里~ 如果你覺得這篇內容對你有幫助,不妨點個贊讓更多人看到;如果有任何想法、疑問,或者想分享你的相關經歷,歡迎在評論區留言交流,你的每一條互動對我來說都很珍貴~ 我們下次再見啦!😊😊

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

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

相關文章

CTFHub SSRF通關筆記6:Gopher Redis原理詳解與滲透實戰

目錄 一、SSRF Gopher Redis 1、功能簡介 2、攻擊原理 (1)SSR的作用 (2)Gopher 協議特性 (3)攻擊 Redis 步驟 二、gopherus 1、功能簡介 2、攻擊Redis服務方法 三、Gopherus安裝 1、源碼下載 2…

數據結構之二叉樹(2)

數據結構之二叉樹(2)1.二叉樹的存儲結構2.實現順序結構二叉樹2.1何為堆2.2堆的性質2.3堆的定義2.3堆的初始化與銷毀3.1向上調整算法3.2向下調整算法4.入堆5.出堆讓花成花,讓樹成樹上一次我們學習了樹的分類,并初步了解了二叉樹。今…

Linux操作系統之Ubuntu

Ubuntu是基于Debian的開源Linux發行版,由Canonical公司維護,以用戶友好性和穩定性著稱。它廣泛應用于個人電腦、服務器及云計算環境,支持多種硬件架構。Ubuntu的特點Ubuntu提供定期更新版本(每6個月)和長期支持版本&am…

kotlin的函數前面增加suspend關鍵字的作用

deepseek回答: Kotlin中suspend關鍵字的作用詳解 核心作用 suspend關鍵字用于標記?掛起函數?,使其能夠在協程中實現非阻塞的異步操作。 suspend關鍵字的本質作用 suspend關鍵字的主要作用是?標記一個函數為掛起函數?,使其能夠在協程中使用…

Vibe Coding實戰項目:用Qwen3-Coder做了個AI跳舞視頻生成器

大家好,這里是K姐。 一個 Vibe Coding 的探索者。 前段時間發現通義發起了一個Qwen3-Coder挑戰賽,最高獎金有10000元,研究了一下,我發現這個賽道太寬了,不限項目,用 AI Coding 做數據分析、個人Blog、抓取…

Kafka面試精講 Day 13:故障檢測與自動恢復

【Kafka面試精講 Day 13】故障檢測與自動恢復 在“Kafka面試精講”系列的第13天,我們將深入探討 Kafka 高可用體系中的關鍵一環:故障檢測與自動恢復機制。作為分布式系統的核心能力,Kafka 如何在 Broker 宕機、網絡分區或磁盤故障時快速感知…

【前沿技術拓展Trip Two】具身智能

具身智能(Embodied AI)的認識,進展,以及為何難以實現 在講具身智能之前,我們不得不先行介紹一下離身智能與離身認識系統這兩個極其相關且更加常見的概念 離身認識系統 其實目前絕大多數的AI,例如DeepSeek&a…

使用electron將vue3網頁項目包裝成pc客戶端

一、準備前工作在項目的根目錄 打開命令行工具 安裝四個依賴庫安裝報錯的話二、準備工作完成之后,在項目根目錄需要有倆個文件在項目根目錄創建electron文件夾在vite.config.js中添加配置項在package.json中添加配置項運行命令 npm run electron:build 打包關于mac&…

基于安全抽象模型(SAM)的汽車網絡安全防御與攻擊分析

摘要自動駕駛汽車比以往任何一種個人出行交通工具都具有更大的受攻擊可能性。這主要是因為這類汽車對通信有極高的需求,一方面是出于功能和安全方面的考慮,另一方面則是為了滿足舒適性需求。無人駕駛汽車需要與周圍環境進行通信的接口、直接連接&#xf…

線掃相機不出圖原因總結

1、幀觸發信號有問題 線掃相機出圖由幀信號決定開始采集,如果沒有幀信號線掃相機無法識別開始信號,所以不出圖 1)沒有給相機幀信號 幀信號是一個短暫的脈沖信號,持續時間不要太長,相機能識別就可以,一般由plc或者控制卡的數字量輸出口觸發,可以通過監測數字量輸出口來確…

開發避坑指南(46):Java Stream 對List的BigDecimal字段進行求和

需求 對int,long類型的數據求和直接用stream().mapToInt()、stream().mapToDouble(),可是沒有stream().mapToBigDecimal()這樣的方法,那么如何用stream對List的BigDecimal字段進行求和? 代碼實現 直接上代碼 public class OrderIn…

pycharm如何處理python項目間引用

1. 如何在pycharm中將其它項目添加到打開的項目中 如圖所示:文件->打開->附加(Attach)即可2.如何引用:直接作為一個普通package引用即可 from attack_projectxxx.modulexxx import xxx3.pyinstaller如何編譯這種引用其它項目的可執行文…

家庭勞務機器人發展階段與時間預測

家庭勞務機器人大規模進入家庭不會是一個單一的時間點,而是一個分階段、漸進式的過程。我們可以將這個進程分為以下幾個階段,并對每個階段的時間線進行預測:第一階段:單一功能機器人普及(現在 - 2025年)這個…

Zynq開發實踐(FPGA之spi實現)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】雖然串口用的地方比較多,實現起來也比較簡單。但是串口本身速度比較慢,不利于高速數據通信。而且單個串口沒有辦法和很多芯片…

指甲打磨機/磨甲器MCU控制方案開發,輕松解決磨甲問題

美甲打磨機/指甲打磨機核心功能需求 1. 基礎功能 無級調速(5,000-30,000 RPM,PWM控制) 正反轉切換(可選,用于拋光/去角質) 按鍵鎖/防誤觸(長按3秒解鎖) 鋰電池管理(3.7V單節,帶充電指…

臨床數據挖掘與分析:利用GPU加速Pandas和Scikit-learn處理大規模數據集

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,注冊即送-H卡級別算力,80G大顯存,按量計費,靈活彈性,頂級配置,學生更享專屬優惠。 摘要 隨著電子健康記錄(EHR)的普…

二進制安裝MySQL 8.0指南:跨平臺、自定義數據路徑、安全遠程訪問配置

二進制安裝 MySQL 8.0 在生產或測試環境中,我們常常希望避免包管理器帶來的依賴和交互問題,尤其是當系統自帶版本過舊或安裝過程頻繁彈窗時。此時,使用 MySQL 官方提供的二進制壓縮包(Generic Linux Binary) 進行安裝…

Z檢驗與T檢驗的區別與聯系:原理、公式和案例全解

Z檢驗與T檢驗全解析:原理、區別與實際案例 統計學的核心任務之一,就是通過有限的樣本數據去推斷總體特征。在這一過程中,假設檢驗成為了最常見的工具。而在眾多檢驗方法中,Z檢驗與T檢驗幾乎是入門必學,也是應用最廣泛的…

SpringBoot之緩存(最詳細)

文章目錄項目準備新建項目并選擇模塊安裝添加依賴添加application.yml刪除demos.web包編寫pojo層userdto/ResultJson編寫mapper層UserMapper編寫service層UserService編寫controller層編寫配置類MybatisPlusConfig編寫測試類1 緩存分類1.1 MyBatis一級緩存1.2 MyBatis二級緩存1…

B站 韓順平 筆記 (Day 29)

目錄 1(集合的框架體系) 2(Collection接口和常用方法) 2.1(Collection接口實現類特點) 2.2(常用方法) 2.3(遍歷元素方式1:迭代器) 1&#x…