XA兩階段提交協議


因為事務需要實現ACID,即原子性、一致性、隔離性、持久性,所以需要采用一定的機制來保證,通常采用的是分階段提交的方式。

XA:XA協議,規定事務管理器和資源管理器接口,采用二階段提交協議。

一階段提交協議

一階段提交協議相對簡單,如下圖:

當然,前提是開啟了事務,然后在應用程序發出提交/回滾請求后,數據庫執行操作,而后將成功/失敗返回給應用程序,程序繼續執行。

一階段提交協議相對簡單,簡單帶來的優點就是,它不用再與其他的對象交互,節省了判斷步驟和時間,所以在性能上是在階段提交協議中對好的。

二階段提交協議

一階段提交協議有其優點,但缺點也很明顯:

  • 數據庫確認執行事務的時間較長,出問題的可能性就隨之增大。
  • 如果有多個數據源,一階段提交協議無法協調他們之間的關系。

所以在一階段協議的基礎上,有了二階段協議,二階段協議的好處是添加了一個管理者角色,如下:

很明顯,二階段協議通過將兩層變為三層,增加了中間的管理者角色,從而協調多個數據源之間的關系,二階段提交協議分為兩個階段。

第一階段

應用程序調用了事務管理器的提交方法,此后第一階段分為兩個步驟:

  • 事務管理器通知參與該事務的各個資源管理器,通知他們開啟事務、執行SQL(暫不提交),並進入prepare狀態(該狀態下可執行commit / rollback)
  • 資源管理器接收到消息后開始准備階段,寫好事務日志並執行事務,但不提交,然后將是否就緒的消息返回給事務管理器(此時已經將事務的大部分事情做完,以后的內容耗時極小)。

第二階段

第二階段也分為兩個步驟:    

  • 事務管理器在接受各個消息后,開始分析,如果有任意其一失敗,則發送回滾命令,否則發送提交命令。
  • 各個資源管理器接收到命令后,執行(耗時很少),並將提交消息返回給事務管理器。

事務管理器接受消息后,事務結束,應用程序繼續執行。

 

為什么要分兩步執行?

一是因為分兩步,就有了事務管理器統一管理的機會;二盡可能晚地提交事務,讓事務在提交前盡可能地完成所有能完成的工作,這樣,最后的提交階段將是耗時極短,耗時極短意味着操作失敗的可能性也就降低。

同時,二階段提交協議為了保證事務的一致性,不管是事務管理器還是各個資源管理器,每執行一步操作,都會記錄日志,為出現故障后的恢復准備依據。

二階段提交協議的存在的弊端是阻塞

因為事務管理器要收集各個資源管理器的響應消息,如果其中一個或多個一直不返回消息,則事務管理器一直等待,應用程序也被阻塞,甚至可能永久阻塞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM