Java事務API - JTA

 Java事務API(JTA;Java Transaction API)和它的同胞Java事務服務(JTS;Java TransactionService),爲J2EE平臺提供了分佈式事務服務。一個分佈式事務(distributedtransaction)包括一個事務管理器(transaction manager)和一個或多個資源管理器(resource manager)。一個資源管理器(resource manager)是任意類型的持久化數據存儲。事務管理器(transaction manager)承擔着所有事務參與單元者的相互通訊的責任。下車站顯示了事務管理器和資源管理的間的關係。

  JTA事務比JDBC事務更強大。一個JTA事務可以有多個參與者,而一個JDBC事務則被限定在一個單一的數據庫連接。下列任一個Java平臺的組件都可以參與到一個JTA事務中:

  .JDBC連接

  .JDO PersistenceManager 對象

  .JMS 隊列

  .JMS 主題

  .企業JavaBeans(EJB)

  .一個用J2EE Connector Architecture 規範編譯的資源分配器。

  使用JTA的事務劃分 

  要用JTA來劃分一個事務,應用程序調用javax.transaction.UserTransaction接口中的方法。示例4顯示了一個典型的JNDI搜索的UseTransaction對象。

 

 

應用程序有了UserTransaction對象的引用之後,就可以象示例5那樣來起動事務。

 

 

 

當應用程序調用commit()時,事務管理器使用兩段提交協議來結束事務。JTA事務控制的方法:

 

javax.transaction.UserTransaction接口提供了下列事務控制方法:

 

 

 

應用程序調用begin()來起動事務,即可調用commit()也可以調用rollback()來結束事務。

  使用JTA和JDBC

   開發人員經常使用JDBC來作爲DAO類中的底層數據操作。如果計劃使用JTA來劃分事務,你將需要一個實現了javax.sql.XADataSource,javax.sql.XAConnection和javax.sql.XAResource接口JDBC的驅動。實現了這些接口的驅動將有能力參與到JTA事務中。一個XADataSource對象是一個XAConnection對象的工廠。XAConnections是參與到JTA事務中的連接。

 

 

 

 

  你需要使用應用程序服務器管理工具來建立XADataSource對象。對於特殊的指令請參考應用程序服務器文檔和JDBC驅動文檔。

  J2EE應用程序使用JNDI來查找數據源。一旦應用程序有了一個數據源對象的引用,這會調用javax.sql.DataSource.getConnection()來獲得數據庫的連接。

  XA連接區別於非XA連接。要記住的是XA連接是一個JTA事務中的參與者。這就意味着XA連接不支持JDBC的自動提交特性。也就是說應用程序不必在XA連接上調用java.sql.Connection.commit()或java.sql.Connection.rollback()。相反,應用程序應該使用UserTransaction.begin()、UserTransaction.commit()和UserTransaction.rollback().

  選擇最好的方法

  我們已經討論了JDBC和JTA是怎樣劃分事務的。每一種方法都有它的優點,回此你需要決定爲你的應用程序選擇一個最適應的方法。 在我們團隊許多最近的對於事務劃分的項目中使用JDBC API來創建DAO類。這DAO類總結如下:

  .事務劃分代碼被嵌入到DAO類內部

  .DAO類使用JDBC API來進行事務劃分

  .調用者沒有劃分事務的方法

  .事務範圍被限定在一個單一的JDBC連接

  JDBC事務對複雜的企業應用程序不總是有效的。如果你的事務將跨越多個DAO對象或多個數據庫,那麼下面的實現策略可能會更恰當:

  .用JTA對事務進行劃分

  .事務劃分代碼被DAO分開

  .調用者承擔劃分事務的責任

  .DAO參與一個全局的事務中

  JDBC方法由於它的簡易性而具有吸引力,JTA方法提供了更多靈活性。你選擇什麼樣的實現將依賴於你的應用程序的特定需求。

  JTA(Java Transaction API) 爲 J2EE 平臺提供了分佈式事務服務。

 

  要用 JTA 進行事務界定,應用程序要調用 javax.transaction.UserTransaction 接口中的方法。例如:

 

 

 

讓我們來關注下面的話:

  “用 JTA 界定事務,那麼就需要有一個實現 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅動程序。一個實現了這些接口的驅動程序將可以參與 JTA 事務。一個 XADataSource 對象就是一個 XAConnection 對象的工廠。 XAConnection s 是參與 JTA 事務的 JDBC 連接。”

  要使用JTA事務,必須使用XADataSource來產生數據庫連接,產生的連接爲一個XA連接。

  XA連接(javax.sql.XAConnection)和非XA(java.sql.Connection)連接的區別在於:XA可以參與JTA的事務,而且不支持自動提交。

  Note:

  Oracle, Sybase, DB2, SQL Server等大型數據庫才支持XA, 支持分佈事務。 

  My SQL 連本地都支持不好,更別說分佈事務了。

  MySql 在5.0的版本後增加了對xa的支持

  JTA方式的實現過程:

  用XADataSource產生的XAConnection它擴展了一個getXAResource()方法,事務通過這個方法把它加入到事務容器中進行管理.對於調用者來說,根本看不到事務是如果管理的,你只要聲明開始事務,告訴容器我下面的操作要求事務參與了,最後告訴事務說到這兒可以提交或回滾了,別的都是黑箱操作。

  在使用JTA之前,你必須首先實現一個Xid類用來標識事務(在普通情況下這將由事務管理程序來處理)。Xid包含三個元素:formatID、gtrid(全局事務標識符)和bqual(分支修飾詞標識符)。

 

  下面的例子說明Xid的實現:

 

 

 

  其次,你需要創建一個你要使用的數據庫的數據源:

 

 

 

例1這個例子是用“兩步提交協議”來提交一個事務分支:

 

 

 

 

當然,實際過程中,我們不需要寫這些代碼,這些代碼是JTA最終的實現代碼。

關於“兩步提交協議”,可以參看下面的文章:

http://www.jspcn.net/htmlnews/11049371131251752.html

http://www.vermicelli.pasta.cs.uit.no/ipv6/students/andrer/doc/html/node18.html

選擇最好的方式

用 JDBC API 進事務界定來構建 DAO 類的。這些 DAO 類可以總結如下:

事務界定代碼嵌入在 DAO 類中。 

DAO 類使用 JDBC API 進行事務界定。 

調用者不能界定事務。 

事務範圍侷限於單個 JDBC 連接。 

JDBC 事務並不總是適合複雜的企業應用程序。如果您的事務要跨越多個 DAO 或者多個數據庫,那麼下列實現策略也許更合適:

事務用 JTA 界定。 

事務界定代碼從 DAO 中分離出來。 

調用者負責界定事務。 

DAO 加入一個全局事務。 

JDBC 方式由於其簡單性而具有吸引力,JTA 方式提供了更大的靈活性。您所選擇的實現將取決於應用程序的特定需求。

XADataSource例子:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章