天天看點

分布式事務(XA、2PC、3PC介紹)

XA簡單介紹

XA是由X / Open釋出的規範,用于DTP(分布式事務處理)。

DTP分布式模型主要含有

  • AP: 應用程式
  • TM: 事務管理器
  • RM: 資料總管(如資料庫)
  • CRM: 通訊資料總管(如消息隊列)

XA主要就是TM和RM之間的通訊橋梁。

2PC

兩階段送出協定(The two-phase commit protocol,2PC)是 XA 用于在全局事務中協調多個資源的機制。

2PC将事務的送出過程分為兩個階段來進行處理

  • 準備階段
    1. TM向所有RM發送事務内容,詢問是否可以送出事務,并等待所有RM答複。
    2. RMs執行事務操作,将操作資訊記入事務日志中,但不送出事務
    3. 如RM執行成功,給TM回報YES;如執行失敗,給TM回報NO。
  • 送出階段
    1. 所有RM均回報YES時,即送出事務
    2. 任何一個RM回報NO時,即中斷事務并進行復原。

3PC

3PC是2PC的改進版,其将二階段送出協定的“準備階段”一份為二,形成了cancommit,precommit,docommit三個階段。

  • CanCommit階段
    1. TM向RMs發送CanCommit請求。詢問是否可以執行事務送出操作。然後開始等待RM的響應。
    2. RMs接到CanCommit請求之後,正常情況下,如果可以順利執行事務,則傳回Yes,并進入預備狀态。否則回報No
  • PreCommit階段
    • 正常情況:所有RM均回報YES時,即送出事務
      1. TM向RM發送PreCommit請求,并進入Prepared階段。
      2. RM接收到PreCommit請求後,會執行事務操作,并将undo和redo資訊記錄到事務日志中。
      3. 如果RM成功的執行了事務操作,則傳回ACK響應,同時開始等待最終指令。
    • 有任何一個RM向TM發送了No響應,或者等待逾時之後,TM都沒有接到RM的響應,那麼就執行事務的中斷。
      1. TM向所有RM發送abort請求。
      2. RM收到來自TM的abort請求之後(或逾時之後,仍未收到TM的請求),執行事務的中斷。
  • doCommit階段
    • 正常
      1. TM接收到RM發送的ACK響應,那麼他将從預送出狀态進入到送出狀态。并向所有RM發送doCommit請求。
      2. RM接收到doCommit請求之後,執行正式的事務送出。并在完成事務送出之後釋放所有事務資源。
      3. 事務送出完之後,向TM發送Ack響應。
      4. TM接收到所有RM的ack響應之後,完成事務。
    • TM沒有接收到RM發送的ACK響應(可能是TM發送的不是ACK響應,也可能響應逾時),那麼就會執行中斷事務。
      1. TM向所有RM發送abort請求。
      2. RM接收到abort請求之後,利用其在階段二記錄的undo資訊來執行事務的復原操作,并在完成復原之後釋放所有的事務資源。
      3. RM完成事務復原之後,向TM發送ACK消息。
      4. TM接收到RM回報的ACK消息之後,執行事務的中斷。

小結

2PC的主要問題有三點:

  • 兩個階段事務處于阻塞狀态
  • TM出現問題,一直修複不了的話,RM會一直阻塞
  • 由于網絡問題或者TM發送一半挂了 ,隻有部分RM收到commmit請求,會導緻資料的不一緻

3PC在二、三階段引入逾時自動送出事務的機制和RM完成事務後釋放資源,有效的防止2PC的前兩種情況。

3PC資料一緻性的問題還是存在,doCommit時,TM發送abort請求,但由于網絡問題,部分RM沒有接受到。這樣就會出現部分RM執行commit,另外一部分執行abort,進而導緻資料不一緻的問題。

refer

https://www.infoq.cn/article/xa-transactions-handle/

https://blog.csdn.net/u013679744/article/details/79188945

部落格

個人部落格同步更新