XA簡單介紹
XA是由X / Open釋出的規範,用于DTP(分布式事務處理)。
DTP分布式模型主要含有
- AP: 應用程式
- TM: 事務管理器
- RM: 資料總管(如資料庫)
- CRM: 通訊資料總管(如消息隊列)
XA主要就是TM和RM之間的通訊橋梁。
2PC
兩階段送出協定(The two-phase commit protocol,2PC)是 XA 用于在全局事務中協調多個資源的機制。
2PC将事務的送出過程分為兩個階段來進行處理
- 準備階段
- TM向所有RM發送事務内容,詢問是否可以送出事務,并等待所有RM答複。
- RMs執行事務操作,将操作資訊記入事務日志中,但不送出事務
- 如RM執行成功,給TM回報YES;如執行失敗,給TM回報NO。
- 送出階段
- 所有RM均回報YES時,即送出事務
- 任何一個RM回報NO時,即中斷事務并進行復原。
3PC
3PC是2PC的改進版,其将二階段送出協定的“準備階段”一份為二,形成了cancommit,precommit,docommit三個階段。
- CanCommit階段
- TM向RMs發送CanCommit請求。詢問是否可以執行事務送出操作。然後開始等待RM的響應。
- RMs接到CanCommit請求之後,正常情況下,如果可以順利執行事務,則傳回Yes,并進入預備狀态。否則回報No
- PreCommit階段
- 正常情況:所有RM均回報YES時,即送出事務
- TM向RM發送PreCommit請求,并進入Prepared階段。
- RM接收到PreCommit請求後,會執行事務操作,并将undo和redo資訊記錄到事務日志中。
- 如果RM成功的執行了事務操作,則傳回ACK響應,同時開始等待最終指令。
- 有任何一個RM向TM發送了No響應,或者等待逾時之後,TM都沒有接到RM的響應,那麼就執行事務的中斷。
- TM向所有RM發送abort請求。
- RM收到來自TM的abort請求之後(或逾時之後,仍未收到TM的請求),執行事務的中斷。
- 正常情況:所有RM均回報YES時,即送出事務
- doCommit階段
- 正常
- TM接收到RM發送的ACK響應,那麼他将從預送出狀态進入到送出狀态。并向所有RM發送doCommit請求。
- RM接收到doCommit請求之後,執行正式的事務送出。并在完成事務送出之後釋放所有事務資源。
- 事務送出完之後,向TM發送Ack響應。
- TM接收到所有RM的ack響應之後,完成事務。
- TM沒有接收到RM發送的ACK響應(可能是TM發送的不是ACK響應,也可能響應逾時),那麼就會執行中斷事務。
- TM向所有RM發送abort請求。
- RM接收到abort請求之後,利用其在階段二記錄的undo資訊來執行事務的復原操作,并在完成復原之後釋放所有的事務資源。
- RM完成事務復原之後,向TM發送ACK消息。
- 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
部落格
個人部落格同步更新