在分佈式事務的學習過程當中會遇到許多概念:X/Open XA、兩段式提交(2PC)、JTA等,如下就這些概念進行解釋,重點在於概念之間的關係,望拋磚引玉,爲後來者指路。html
(摘自wiki)XA規範是開放羣組關於分佈式事務處理 (DTP)的規範。規範描述了全局的事務管理器與局部的資源管理器之間的接口。XA規範的目的是容許的多個資源(如數據庫,應用服務器,消息隊列,等等)在同一事務中訪問,這樣可使ACID屬性跨越應用程序而保持有效。XA使用兩階段提交來保證全部資源同時提交或回滾任何特定的事務。
要理解XA規範,必須先理解DTP,DTP全稱爲Distributed Transaction Processing Reference Model,他也是一個規範,他定義了一些模型對象和對象間行爲,經過這些對象和對象間行爲來指導分佈式事務實現。若是你瞭解領域驅動設計,你會發現DTP就是對分佈式事務這個領域進行模型設計。java
DTP協議假設整個分佈式事務有三個對象參與完成,他們分別是:算法
瞭解了DTP的定義,咱們再看XA規範,XA規範描述全局的事務管理器(TM)與局部的資源管理器(RM)之間的接口,這個接口不是編程層面的接口,而是DTO定義模型之間直接交互的系統接口。數據庫
咱們依然用領域建模的概念理解這個定義。咱們的世界是動態,咱們要描述一個事物不能只有現實事物對應的靜態抽象對象模型,還須要有對象動態交互行爲的描述,只有靜態的模型和動態的行爲一切運做,才能完成咱們的對現實世界的建模過程。XA協議就是這個動態行爲的描述。他包含於DTP協議中,專門描述TM和RM之間如何交互以通力協做完成分佈式事務。編程
咱們常常聽到某某數據庫支持XA協議,某某分佈式事務中間件支持XA協議,如今應該能理解他們的含義了,由於分佈式事務參與方衆多,只有各方都按照同一規則交互,才能最終完成分佈式事務。因此從某種意義上說,XA協議就像一份分佈式事務的操做指南,各方只要按照操做指南規定一步一步的完成操做,就會完成最終目標。服務器
(摘自wiki)二階段提交(英語:Two-phase Commit)是指,爲了使基於分佈式系統架構下的全部節點在進行事務提交時保持一致性而設計的一種算法(Algorithm)。一般,二階段提交也被稱爲是一種協議(Protocol)。在分佈式系統中,每一個節點雖然能夠知曉本身的操做時成功或者失敗,卻沒法知道其餘節點的操做的成功或失敗。當一個事務跨越多個節點時,爲了保持事務的ACID特性,須要引入一個做爲協調者的組件來統一掌控全部節點(稱做參與者)的操做結果並最終指示這些節點是否要把操做結果進行真正的提交(好比將更新後的數據寫入磁盤等等)。所以,二階段提交的算法思路能夠歸納爲: 參與者將操做成敗通知協調者,再由協調者根據全部參與者的反饋情報決定各參與者是否要提交操做仍是停止操做。
若是說XA規範是實現分佈式事務操做指南的話,那兩段式提交就是這本操做指南的核心概念和理論依據。全部實現XA協議的關係數據庫和第三方分佈式事務中間件都使用2PC算法。架構
(摘自wiki)Java事務API(Java Transaction API,簡稱JTA ) 是一個Java企業版的應用程序接口,在Java環境中,容許完成跨越多個XA資源的分佈式事務。JTA是在Java社區過程下制定的規範,編號JSR 907。JTA提供:oracle
- 劃分事務邊界
- X/Open XA API容許資源參與到事務中。
定義是否是不知所云,簡單說JTA主要就是XA協議的程序級定義。什麼是程序級定義?若是咱們把XA協議做爲領域模型的話,咱們須要用具體的語言來實現領域模型,JTA就是用Java實現的XA協議,可是他只定義了相應的接口,並無給出具體實現,爲了可以完成分佈式事務,咱們須要本身按照「兩段式提交」算法完成本身的實現,或者藉助第三方中間件,例如BTM,atomikos等。app
DTP定義分佈式事務過程。
XA定義DTP中TM和RM的交互行爲。
XA由2PC算法實現。
JTA主要是XA規範的JAVA接口描述分佈式
參考:
https://zh.wikipedia.org/wiki...
http://www.opengroup.org/book...
https://zh.wikipedia.org/wiki...
https://zh.wikipedia.org/wiki...
http://www.oracle.com/technet...
http://download.oracle.com/ot...《Distributed Transaction Processing:The XA Specification》《Java Transaction API》