#挑戰30天在頭條寫日記#
在傳統的單體應用中,事務管理相對較為簡單,可以通過資料庫事務來實作資料的一緻性。然而,随着系統的拆分和分布式架構的應用,跨多個服務的事務操作變得更為複雜。這就引出了分布式事務的概念,它是保證分布式系統資料一緻性的關鍵。
1、基于XA協定
在分布式系統中,多個事務同時進行并涉及多個資料庫或資料總管(RM)時,需要確定資料的一緻性。XA協定是一種常見的分布式事務管理協定,它提供了一種可靠的機制來協調并保證分布式事務的正确執行。XA協定提供了兩種主要的送出政策:兩階段送出和三階段送出。本文将深入探讨這兩種政策的原理和特點,以及它們在實際應用中的使用。
2、兩階段送出協定(2PC)
兩階段送出協定用于保證分布式事務的原子性,即所有的參與節點或者全部都執行或者全部不執行,其執行過程主要分為兩個階段:
第一階段,準備階段;第二階段,送出階段。
1)準備階段
協調者為每個參與者都發送prepare消息,每個參與者進行表決,傳回同意或取消。預執行本地事務,資源阻塞,但不送出事務。
2)送出階段
協調者基于每個參與者準備階段的表決,當且僅當所有參與者同意送出,協調者才通知所有的參與者送出事務,否則協調者将通知所有的參與者取消事務。
3、三階段送出協定(3PC)
三階段送出協定在協調者和參與者中都引入逾時機制,并且把兩階段送出協定的第一個階段拆分成了兩步:詢問,然後再鎖資源,最後真正送出。
三個階段的執行
-
CanCommit階段
協調者向參與者發送CanCommit請求,參與者如果可以送出,就傳回Yes響應,否則傳回No響應。
-
PreCommit階段
協調者根據參與者的反應情況來決定是否可以繼續事務的PreCommit操作。
- DoCommit階段
協調者基于每個參與者PreCommit階段的回報結果,決定真正送出事務,還是中斷事務。
3、2PC與3PC對比
2PC | 3PC | |
逾時 | 協調者可設定逾時 | 協調者、參與者均可設定逾時 |
阻塞 | 進入詢問後阻塞所有節點 | 第一階段緩沖,通過後第二階段才阻塞 |
一緻性 | 節點異常會發生不一緻性 | 節點異常會發生不一緻性 |
在分布式系統中,2PC(兩階段送出)和3PC(三階段送出)是兩種常見的事務協定,用于確定分布式事務的一緻性。下面是它們之間的對比:
- 階段數不同:2PC隻有兩個階段,即準備階段和送出階段;而3PC有三個階段,即準備階段、預送出階段和正式送出階段。
- 逾時機制不同:2PC沒有逾時機制,一旦進入等待狀态,參與者将一直等待直到收到響應;而3PC引入了逾時機制,如果在規定的時間内沒有收到大多數參與者的響應,則會復原事務。
- 2PC和3PC都有可能發生阻塞情況,但是3PC相對于2PC來說更容易避免阻塞情況的發生。
- 2PC 和 3PC 都無法完美解決分布式資料一緻性問題,雖然無法保證事務ACID特性,但解決問題的思想在很多實際架構中有着廣泛應用。
- 可用性不同:由于3PC引入了預送出和正式送出兩個階段,是以在網絡分區等異常情況下,可以更好地處理節點故障等問題,提高了系統的可用性和可靠性。
- 實作複雜度不同:由于3PC需要更多的資源和時間來實作,是以相對于2PC來說,實作起來更加複雜。
==============================
如果文章對你有幫助,請不要忘記加個關注、點個贊!