分布式事物XA、BASE、TCC、SAGA、AT

分布式事務——Seata

一、Seata的架構:

1、什么是Seata:

它是一款分布式事務解決方案。官網查看:Seata

2.執行過程

在分布式事務中,會有一個入口方法去調用各個微服務,每一個微服務都有一個分支事務,因此調用了多少個微服務,全局事務就有多少個分支事務,TM代理這個入口方法,因此就定義了全局事務的范圍

當入口方法被執行時,TM會先攔截這個方法的執行會先想TC發送一個請求,注冊這個全局事務(開啟全局事務請求),然后既可以開始執行這個入口的業務邏輯了,開始調用每一個微服務。到了微服務里面,每個分支事務就開始執行,這個時候RM就會代理分支業務在分支業務執行之前向TC注冊分支事務,然后開始執行分支業務。在執行完成后,有RM向TC報告分支事務的狀態。

因此,TC就知道了所有的分支事務的狀態,然后等到全部分支業務執行完成TM向TC發送全局事務狀態的時候TC就會檢查分支事務的狀態,如果都成功,就讓各個分支事務都去提交,如果失敗就讓它們都回滾

二、部署TC服務,微服務集成Seata:

在上圖中可以知道,TM和RM其實是對業務方法的代理和管理,而TC是脫離業務之外的一個服務,由它去協調TM和RM,協調全局事務和分支事務。

三、XA模式:

1、認識:

XA規范是分布式事務處理標準,它描述了全局的TM和局部的RM之間的接口,幾乎所有的主流的數據庫都對XA規范提供了支持;

2、執行原理:

XA將分布式事務分為兩個階段,一個是準備階段,一個是執行階段

準備階段: 事務協調者會向事務參與者RM發送一個請求,這里的RM其實是由數據庫實現的,所以可以認為RM就是數據庫。讓數據庫去執行事務,但執行完不要提交,而是把結果告知事務協調者

執行階段: 事務協調者根據結果,通知RM回滾或者提交事務。


3、Seata的XA模式:

TM是分布式事務的入口,分別調用分支事務。

第一階段:準備階段

1.1-->1.2-->1.3-->1.4-->1.5

TM入口,向TC注冊全局事務-->TM調用分支事務RM-->分支事務注冊到TC-->RM調用執行分支業務sql-->RM報告給TC分支事務執行但未提交后狀態

第二階段:執行階段

2.1-->2.2-->2.3

TM向TC發送事務狀態(比如Commit),-->TC 檢查各分支RM報告的狀態-->都成功那就讓各分支事務Commit,如果有一個失敗,都回滾

4、總結:

優點:
這是一種強一致性的解決方案,因為每一個微服務都是基于各自的事務的,各自的事務是滿足ACID的,而且等到大家都執行完了且都成功了才提交,所以全局事務是滿足ACID的。

實現比較簡單,因為很多數據庫都實現了這種模式,使用Seata的XA模式只需要簡單的封裝上TM。

缺點:
第一階段不提交,等到第二階段再提交,但是等的過程中要占用數據庫鎖,如果一個分布式事務中跨越了很多個分支事務,則可能造成很多資源的浪費,使得別的請求無法訪問,降低了可用性

依賴于數據庫,對于如果有的數據庫沒有實現這種模式,則無法使用這個模式來實現分布式事務

5、實現:


四、TCC模式:

1、模式原理:

TCC的模式主要體現在分支服務的內部


2、優缺點:

冪等是一個數學與計算機科學概念。

  • 在數學中,冪等用函數表達式就是:f(x) = f(f(x))。比如求絕對值的函數,就是冪等的,abs(x) = abs(abs(x))
  • 計算機科學中,冪等表示一次和多次請求某一個資源應該具有同樣的副作用,或者說,多次請求所產生的影響與一次請求執行的影響效果相同

什么是冪等設計-CSDN博客


3、案例:

空回滾?是指在分布式事務中,在沒有調用參與方的 Try 方法的情況下,直接調用了二階段的 Cancel 方法。這種情況通常發生在分布式事務的全局事務開啟后,某個參與者分支在執行一階段(Try)操作時由于宕機或網絡異常等原因未能成功執行,但全局事務已經開啟并需要推進到終態。此時,系統會調用該參與者的 Cancel 方法進行回滾操作,但由于 Try 方法未執行,這種回滾操作被稱為空回滾?。

空回滾的原因

空回滾的主要原因包括:

  1. ?網絡異常?:在分布式系統中,網絡異常可能導致某個分支的 Try 方法未能成功執行。
  2. ?機器宕機?:參與事務處理的服務器宕機也會導致 Try 方法未能執行。
  3. ?全局事務超時?:如果全局事務超時,系統會強制進行回滾操作,但由于 Try 方法未執行,導致空回滾。

防止空回滾的解決方案

為了防止空回滾,可以在 Cancel 方法中增加一個事務控制表來記錄 Try 方法的執行狀態。具體步驟如下:

  1. ?Try 方法執行時?:在事務控制表中插入一條記錄,表示一階段執行了。
  2. ?Cancel 方法執行時?:讀取這條記錄。如果記錄不存在,說明 Try 方法沒有執行,直接返回成功,避免空回滾?

?業務懸掛?是指在分布式事務處理中,一個事務在執行過程中,由于某些原因導致事務分支在嘗試提交或回滾時無法完成操作,從而使事務處于未決狀態?。這種情況通常是由于網絡問題、資源鎖定沖突、服務宕機等原因造成的?。

業務懸掛的影響

業務懸掛會導致數據不一致,阻塞后續事務的執行,嚴重時可能會影響整個系統的正常運行?1。具體來說,懸掛的事務會長時間占用資源,導致其他事務無法訪問這些資源,從而產生阻塞和死鎖的問題?。

業務懸掛的對策

  1. ?超時機制?:設置合理的事務超時時間,超時后自動觸發回滾,以避免事務長時間懸掛?1。
  2. ?事務補償機制?:實現事務補償邏輯,當檢測到事務懸掛時,可以手動或自動進行事務補償?。
  3. ?服務監控和告警?:增強系統的監控能力,對事務懸掛進行實時監控和告警,以便及時發現并處理問題?

4、新概念:

空回滾:這個時候cancel不能報錯,因為如果報錯則seata會進行等待,然后再繼續執行cancel,進而一直循環等待。


業務懸掛:


五、AT模式:

1、AT模式原理:

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


2、AT模式的臟讀問題:

雖然AT模式的性能相比XA的性能有所提升,但是它也有自己的缺點:正是以為它執行完sql就直接提交了,在并發的情況下,就可能會出現問題:


3、全局鎖:

全局鎖:由TC(事務協調者)記錄當前正在操作某行數據的事務,該事務持有全局鎖,具備執行權。


4、全局鎖和XA中事務不提交占用鎖資源的區分:

XA中事務不提交,占用的是數據庫的鎖所有的crud的操作都會被限制
TC上的全局鎖只是記錄操作某張表的某行的全局事務,是由Seata管理的,對于不是Seata管理的相關事務,依舊可以直接操作數據表。比如由其他業務要修改同張表同行數據的其他字段,這個時候是可以的。

所以全局鎖比XA中的鎖的粒度要小

如果修改的還是同一個字段,雖然這種情況出現的概率很低,但是AT也有解決方案:因為它保存了兩個快照。


5、優缺點:


6、實現:


六、SAGA模式:

1、Soga模式原理:

它是Seata提供的長事務解決方案,分為兩個階段:

  1. 直接提交本地事務;
  2. 如果成功:什么都不做;
  3. 如果失敗:通過編寫補償業務來回滾;

2、優缺點:


七、四種模式的對比:

(二)分布式事務——Seata、XA、TCC、AT、SAGA模式_xa tcc saga-CSDN博客

(二)分布式事務——Seata、XA、TCC、AT、SAGA模式 - 姚春輝 - 博客園

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

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

相關文章

MySQL為什么使用B+樹來作索引

我來詳細解釋一下B樹的結構和特點。 graph TDA[根節點 40|70] --> B[20|30]A --> C[50|60]A --> D[80|90]B --> E[10|15]B --> F[25|28]B --> G[35|38]C --> H[45|48]C --> I[55|58]C --> J[65|68]D --> K[75|78]D --> L[85|88]D --> M[9…

python 下載 b站視頻 和音頻

video_bvid: import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一個從外部得到的單個視頻ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

2024年06月中國電子學會青少年軟件編程(Python)等級考試試卷(五級)答案 + 解析

青少年軟件編程(python)等級考試試卷(五級) 一、單選題(共25題,共50分) range()函數的基本用法是什么?( ) A. 生成一個等差數列 B. 生成一個隨機數列 C. 生成一個遞增數列 D. 生成一個遞減數列 正確答案:A 答案解析:range() 函數用于生成一個等差數列,其中起始值、…

以太網鏈路詳情

文章目錄 1、交換機1、常見的概念1、沖突域2、廣播域3、以太網卡1、以太網卡幀 4、mac地址1、mac地址表示2、mac地址分類3、mac地址轉換為二進制 2、交換機的工作原理1、mac地址表2、交換機三種數據幀處理行為3、為什么會泛洪4、轉發5、丟棄 3、mac表怎么獲得4、同網段數據通信…

Shell編程 腳本的運行方式與注釋

目錄 shell腳本的運行方式 1. 路徑運行 2.bash或sh加腳本運行 ?編輯 3.source在加腳本路徑運行 shell腳本注釋 單行注釋 多行注釋 shell腳本的運行方式 我們在/usr/etc/demo01目錄下新建了一個腳本 a.sh ,腳本內容是要求輸出數字1,怎么運行呢 1…

獲取淘寶商品評論數據的API應用:市場調研|產品更新|用戶數據

下面是一段我用item_review(獲取商品評論數據)抓來的商品評論數據: "items": {"total_results": 375,"totalpage": 38,"page_size": 10,"page": "1","item": [{&quo…

智算網絡中Scale-out和Scale-up網絡的技術原理

智算網絡中Scale-out網絡和Scale-up網絡的本質區別是什么? 一、什么是智算中心的Scale-out網絡和Scale-up網絡 數據中心網絡總體上可分為兩大類:通算網絡和智算網絡。通算網絡主要用于支持傳統的計算任務和應用,如企業的IT系統、網站托管、電…

HCIA筆記7--OSPF協議入門

文章目錄 0. 路由分類1. OSPF介紹1.1 概念1.2 報文類型 2. 鄰接關系的建立2.1 鄰居關系的建立2.2 鄰接關系的形成2.3 ospf狀態機 3. DR與BDR3.1 為什么要有DR和BDR?3.2 DR和BDR的選舉原則 4. ospf的配置4.1 內部優先級 5. 問題5.1 三層環路如何解決? Ref…

C05S06-Nginx的內置變量和代理

一、常見內置變量 內置變量說明$uri請求的URL,不包括主機和參數$request_uri請求的URL,包括主機和參數$host請求的主機名$http_user_agent客戶端信息,瀏覽器和操作系統$remote_addr客戶端IP地址$remote_port客戶端端口$server_addr服務端IP地…

mysql排序問題

mysql 建數據庫時,需要指定 字符集 和 排序規則 建表時,也可以指定 也可以指定具體的字段 安照下面的sql順序執行插入,它們的排序是什么樣的? INSERT into test_sort (uid,create_time) VALUE (d,now()) INSERT into test_sort (u…

JAVA 圖形界面編程 AWT篇(1)

前言 為了應對JAVA課設,小編走上了java的圖形界面編程的道路,通過博客分享自己的學習歷程,并進行筆記的記錄。 AWT(Abstract Window Toolkit)介紹 AWT(抽象窗口工具包)是 Java 最早的圖形用戶界…

vulhub復現CVE-2021-44228log4j漏洞

目錄 一:漏洞概述 二:漏洞原理 三:漏洞利用 lookup功能: JNDI解析器: ldap服務: RMI: 四:漏洞復現 4.1靶場 4.2dnslog測試 4.3部署jndi-injection-exploit 4.4打開監聽端口 4.5觸發請…

ip地址獲取失敗啥意思?ip地址獲取失敗怎么回事

在日常的網絡使用中,我們時常依賴于穩定的IP地址來確保數據的順暢傳輸和設備的正常識別。然而,有時我們會遇到“IP地址獲取失敗”的困擾,這不僅阻礙了我們的網絡訪問,還可能帶來一系列的網絡連接問題。那么,IP地址獲取…

如何在 Android 項目中實現跨庫傳值

背景介紹 在一個復雜的 Android 項目中,我們通常會有多個庫(lib),而主應用程序(app)依賴所有這些庫。目前遇到的問題是,在這些庫中,libAd 需要獲取 libVip 的 VIP 等級狀態&#xf…

非常規使用client-go踩坑記

0x01 背景 編程者總有想偷懶的傾向。至少我的初衷時,盡量復用現有的代碼。但有時也會變得弄巧成拙。 這不,最近需要在一個Go服務里添加一個CRD的緩存等待。熟悉k8s的同學都知道,向 kube-apiserver 提交一個更新,到同一個進程中的…

OpenGL ES詳解——多個紋理實現混疊顯示

目錄 一、獲取圖片紋理數據 二、著色器編寫 1. 頂點著色器 2. 片元著色器 三、綁定和繪制紋理 1. 綁定紋理 2. 繪制紋理 四、源碼下載 一、獲取圖片紋理數據 獲取圖片紋理數據代碼如下: //獲取圖片1紋理數據 mTextureId loadTexture(mContext, R.mipmap.…

java引用相關(四大引用類型,軟引用避免oom,弱引用表,虛引用和引用隊列,可達性分析算法)

1. 什么是引用? 問題:什么是引用?Java中的引用是如何工作的? 答案: 引用 是對象的句柄,用于訪問堆內存中的對象。在Java中,引用變量實際上存儲的是對象的地址,而不是對象本身。通…

十一、容器化 vs 虛擬化-Docker

文章目錄 前言一、Docker 介紹1. 簡介2. 應用場景3. 特點4. Docker和虛擬機之間的區別5. 解決痛點1. 解決依賴兼容2. 解決操作系統環境差異3. 小結 二、Docker 架構三、工作流程五、Docker 核心組件及其工作機制1. Docker 客戶端(Docker Client)2. Docke…

linux學習筆記01 基礎命令

目錄 創建 touch 創建文件 (創建但是不打開) vi / vim 創建文件 (創建一個文件并打開) mkdir 創建文件夾 切換目錄 cd 查看 pwd 查看當前目錄完整路徑 ls 查看目錄信息 dir 查看目錄信息 ll 表示查看目標目錄下的信息 ls -a 查看當前目錄下的…

【深度學習】深刻理解多模態模型CLIP

CLIP(Contrastive Language-Image Pretraining) 是由 OpenAI 提出的一個多模態模型,旨在學習視覺和語言的聯合表示,能夠通過圖像和文本之間的對比學習來實現圖像和文本之間的緊密聯系。CLIP 模型可以通過自然語言描述理解和處理圖…