Java事務APIJava Transaction API,簡稱JTA )是一個Java企業版應用程式接口,在Java環境中,允許完成跨越多個XA資源的分佈式事務。JTA是在Java社區過程下制定的規範,編號JSR 907。JTA提供:

  • 劃分事務邊界
  • X/Open XA API允許資源參與到事務中。

X/Open XA體系結構

編輯

在X/Open XA的體系結構中,事務管理器或事務處理監控器 (TP monitor)協調 資源跨越多個資源,如數據庫和消息隊列的事務。每一個資源都有自己的管理器。資源管理器通常擁有自己的用於操縱資源的API,例如關係型數據庫使用的JDBC。 此外,資源適配器允許事務管理器協調該資源管理器和其他資源管理器之間的分佈式事務。最後,與事務管理器通訊的應用程式開始,提交,或回滾事務。應用程式同樣需要使用資源自己的API與不同的資源通訊,修改資源。

JTA對X/Open XA體系結構的實現

編輯

JTA API包括兩個Java包下的類:

JTA是以X/Open XA體系結構為基礎設計的,但他定義了兩種不同的事務邊界劃分的API。應用伺服器,如EJB伺服器,與應用組件區別對待。JTA提供了一個接口,javax.transaction.TransactionManager,這是供應用伺服器自己進行開始,提交或回滾事務使用悳,同時還提供了另外一個接口javax.transaction.UserTransaction,這是供一般客戶代碼,如Java Servlet或是EJB管理事務使用的。

為了通過事務管理器管理,JTA架構要求每一個資源管理器必須實現javax.transaction.xa.XAResource接口,如前面所述,每一個資源會有一個自己的特定的API,例如:

  • 關係型數據庫使用JDBC
  • 消息服務使用JMS
  • 一般的企業信息系統(EIS)的資源使用J2EE連接器架構

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容器和服務的提供商。[1]

下面的例子說明了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提供的功能,應用伺服器並不是必需的。[2] 現存在獨立的JTA實現,這樣,在普通的Java應用程式中都可以利用JTA/XA帶來的可靠性。特別是在與類似Spring工具一同使用的時候,這為開發可靠的Java應用程式提供了不同的範式。

開源的JTA實現

編輯

到2010年4月為止,JTA的開源實現有:

以上所有事務管理器可以在J2SE環境中使用。

參見

編輯

參考文獻

編輯

外部連結

編輯