分布式事務——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 方法未執行,這種回滾操作被稱為空回滾?。
空回滾的原因
空回滾的主要原因包括:
- ?網絡異常?:在分布式系統中,網絡異常可能導致某個分支的 Try 方法未能成功執行。
- ?機器宕機?:參與事務處理的服務器宕機也會導致 Try 方法未能執行。
- ?全局事務超時?:如果全局事務超時,系統會強制進行回滾操作,但由于 Try 方法未執行,導致空回滾。
防止空回滾的解決方案
為了防止空回滾,可以在 Cancel 方法中增加一個事務控制表來記錄 Try 方法的執行狀態。具體步驟如下:
- ?Try 方法執行時?:在事務控制表中插入一條記錄,表示一階段執行了。
- ?Cancel 方法執行時?:讀取這條記錄。如果記錄不存在,說明 Try 方法沒有執行,直接返回成功,避免空回滾?
?業務懸掛?是指在分布式事務處理中,一個事務在執行過程中,由于某些原因導致事務分支在嘗試提交或回滾時無法完成操作,從而使事務處于未決狀態?。這種情況通常是由于網絡問題、資源鎖定沖突、服務宕機等原因造成的?。
業務懸掛的影響
業務懸掛會導致數據不一致,阻塞后續事務的執行,嚴重時可能會影響整個系統的正常運行?1。具體來說,懸掛的事務會長時間占用資源,導致其他事務無法訪問這些資源,從而產生阻塞和死鎖的問題?。
業務懸掛的對策
- ?超時機制?:設置合理的事務超時時間,超時后自動觸發回滾,以避免事務長時間懸掛?1。
- ?事務補償機制?:實現事務補償邏輯,當檢測到事務懸掛時,可以手動或自動進行事務補償?。
- ?服務監控和告警?:增強系統的監控能力,對事務懸掛進行實時監控和告警,以便及時發現并處理問題?
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提供的長事務解決方案,分為兩個階段:
- 直接提交本地事務;
- 如果成功:什么都不做;
- 如果失敗:通過編寫補償業務來回滾;
2、優缺點:
七、四種模式的對比:
(二)分布式事務——Seata、XA、TCC、AT、SAGA模式_xa tcc saga-CSDN博客
(二)分布式事務——Seata、XA、TCC、AT、SAGA模式 - 姚春輝 - 博客園