兩階段提交(2PC) 是 Oracle Tuxedo 系統提出的 XA 分佈式事務協議的其中一種實現方式。數據庫
XA協議中有兩個重要角色:事務協調者和事務參與者網絡
既然叫兩階段提交,確定是分爲兩個階段。分佈式
Java 生態下可使用atomikos來快速實現兩階段提交的分佈式事務。atom
順利的狀況下3d
出錯時cdn
在XA的第一階段,若是某個事務參與者反饋失敗消息,說明該節點的本地事務執行不成功,必須回滾。blog
任何一個參與者向協調者反饋了 No 響應,或者在等待超時以後,協調者尚沒法接收到全部參與者的反饋響應,那麼就會中斷事物。事務
在XA分佈式事務的第二階段,若是事務協調節點在以前所收到都是正向返回,那麼它將會向全部事務參與者發出Commit請求。資源
接到Commit請求以後,事務參與者節點會各自進行本地的事務提交,並釋放鎖資源。當本地事務完成提交後,將會向事務協調者返回「完成」消息。get
當事務協調者接收到全部事務參與者的「完成」反饋,整個分佈式事務完成。
兩階段提交涉及屢次節點間的網絡通訊,通訊時間長!且在整個過程當中,全部節點都處於阻塞狀態,全部節點所持有的資源(例如數據庫數據,本地文件等)都處於鎖定狀態
單點故障。因爲協調者的重要性,一旦協調者發生故障。參與者會一直阻塞下去。尤爲在第二階段,協調者發生故障,那麼全部的參與者還都處於鎖定事務資源的狀態中,而沒法繼續完成事務操做。(若是是協調者掛掉,能夠從新選舉一個協調者,可是沒法解決由於協調者宕機致使的參與者處於阻塞狀態的問題)
數據不一致。在二階段提交的階段二中,當協調者向參與者發送commit請求以後,發生了局部網絡異常或者在發送commit請求過程當中協調者發生了故障,這回致使只有一部分參與者接受到了commit請求。而在這部分參與者接到commit請求以後就會執行commit操做。可是其餘部分未接到commit請求的機器則沒法執行事務提交。因而整個分佈式系統便出現了數據不一致性的現象。