X/Open XA體系結構
在X/Open XA的體系結構中,事務管理器或事務處理監控器(TP monitor)協調 資源跨越多個資源,如資料庫和訊息佇列,的事務。每一個資源都有自己的管理器。資源管理器通常擁有自己的用於操縱資源的API,例如關係型資料庫使用的
JDBC。 此外,資源適配器允許事務管理器協調該資源管理器和其他資源管理器之間的分散式事務。最後,與事務管理器通訊的應用程式開始,提交,或回滾事務。應用程式同樣需要使用資源自己的API與不同的資源通訊,修改資源。
JTA對X/Open XA體系結構的實現
JTA API包括兩個Java包下的類:
javax.transaction
javax.transaction.xa
JTA是以X/Open XA體系結構為基礎設計的,但他定義了兩種不同的事務邊界劃分的API。套用伺服器,如
EJB伺服器,與套用組件區別對待。JTA提供了一個接口,javax.transaction.TransactionManager,這是供套用伺服器自己進行開始,提交或回滾事務使用悳,同時還提供了另外一個接口javax.transaction.UserTransaction,這是供一般客戶代碼,如
Java Servlet或是EJB管理事務使用的。
為了通過事務管理器管理,JTA架構要求每一個資源管理器必須實現javax.transaction.xa.XAResource接口,如前面所述,每一個資源會有一個自己的特定的API,例如:
Java事務API
Java事務API由三個部分組成:
UserTransaction - 高層的套用事務劃分接口,供客戶程式使用
TransactionManager - 高層的事務管理器接口,供套用伺服器使用
XAResource,X/Open XA協定的標準Java映射,供事務性資源管理器使用。
UserTransaction接口
javax.transaction.UserTransaction接口給應用程式提供了編程控制事務邊界的能力。該接口可以供Java客戶端程式或EJB使用。
UserTransaction的begin方法開始一個全局事務,並將該事務與調用執行緒關聯。事務到執行緒的管理是由事務管理器完成的,對應用程式透明的。
對嵌套事務的支持不是必須的。如果調用執行緒的上下文已經與事務關聯,並且事務管理器的實現並不支持嵌套的事務,UserTransaction的begin方法調用時將拋出NotSupportedException。
底層的事務管理器的實現負責提供不同應用程式間事務上下文的傳播,事務管理器位於客戶端和伺服器計算機上。 傳播的事務上下文的格式由客戶端和伺服器計算機協商確定。例如,如果事務管理器是JTS規範的實現,將使用CORBA OTS 1.1規範中描述的事務上下文傳播格式。事務上下文的傳播對於應用程式來說是透明的。
EJB伺服器對UserTransaction的支持
EJB伺服器需要支持UserTransaction接口,以供Bean管理事務的EJB使用。通過EJBContext的getUserTransaction方法,EJB構件可以獲取到UserTransaction接口。這樣,EJB應用程式不需要與事務管理器直接互動,就可以劃分事務邊界。取而代之的是EJB依賴於EJB伺服器提供EJB規範中定義的所有事務處理。(EJB伺服器和事務管理器之間的互動對於套用是透明。實現事務管理的責任是在EJB容器和服務的提供商。)
下面的例子說明了Bean管理事務的會話Bean如何使用UserTransaction:
// 在會話Bean的setSessionContext方法中,// 將Bean的上下文存放到一個實例變數中this.ctx = sessionContext;// 在Bean業務邏輯中UserTransaction utx = ctx.getUserTransaction();// 開始一個事務utx.begin();// 做一些事情// 提交utx.commit();
從JNDI獲取UserTransaction
如果環境中安裝了JTA的實現,應可以從java:comp/UserTransaction獲取UserTransaction。
Java標準版對UserTransaction的支持
要使用JTA或UserTransaction提供的功能,套用伺服器並不是必需的。現存在獨立的JTA實現,這樣,在普通的Java應用程式中都可以利用JTA/XA帶來的可靠性。特別是在與類似
Spring工具一同使用的時候,這為開發可靠的Java應用程式提供了不同的範式。