注冊用戶即可下載全站資源 關注Java幫幫微信公眾號
 

JTA規范

4
發表時間:2018-12-11 15:04

JTA規范下載地址:

JTA規范事務模型

   Java事務API(JTA:Java Transaction API)和它的同胞Java事務服務(JTS:Java Transaction Service),為J2EE平臺提供了分布式事務服務(distributed transaction)的能力。 某種程度上,可以認為JTA規范是XA規范的Java版,其把XA規范中規定的DTP模型交互接口抽象成Java接口中的方法,并規定每個方法要實現什么樣的功能。

   在DTP模型中,規定了模型的五個組成元素:應用程序(Application)、資源管理器(Resource Manager)、事務管理器(Transaction Manager)、通信資源管理器(Communication Resource Manager)、 通信協議(Communication Protocol)。

   而在JTA規范中,模型中又多了一個元素Application Server,如下所示:

4FD9C0DD-C543-4C7E-B6AE-F608BCFB6D1E.png


   下面介紹一下在JTA規范中,模型中各個組件的作用:

事務管理器(transaction manager):

  處于圖中最為核心的位置,其他的事務參與者都是與事務管理器進行交互。事務了管理器提供事務聲明,事務資源管理,同步,事務上下文傳播等功能。JTA規范定義了事務管理器與其他事務參與者交互的接口,而JTS規范定義了事務管理器的實現要求,因此我們看到事務管理器底層是基于JTS的。


應用服務器(application server):

   顧名思義,是應用程序運行的容器。JTA規范規定,事務管理器的功能應該由application server提供,如上圖中的EJB Server。一些常見的其他web容器,如:jboss、weblogic、websphere等,都可以作為application server,這些web容器都實現了JTA規范。特別需要注意的是,并不是所有的web容器都實現了JTA規范,如tomcat并沒有實現JTA規范,因此并不能提供事務管理器的功能。


應用程序(application):

   簡單來說,就是我們自己編寫的應用,部署到了實現了JTA規范的application server中,之后我們就可以我們JTA規范中定義的UserTransaction類來聲明一個分布式事務。通常情況下,application server為了簡化開發者的工作量,并不一定要求開發者使用UserTransaction來聲明一個事務,開發者可以在需要使用分布式事務的方法上添加一個注解,就像spring的聲明式事務一樣,來聲明一個分布式事務。

   特別需要注意的是,JTA規范規定事務管理器的功能由application server提供。但是如果我們的應用不是一個web應用,而是一個本地應用,不需要被部署到application server中,無法使用application server提供的事務管理器功能。又或者我們使用的web容器并沒有事務管理器的功能,如tomcat。對于這些情況,我們可以直接使用一些第三方的事務管理器類庫,如JOTM和Atomikos。將事務管理器直接整合進應用中,不再依賴于application server。


資源管理器(resource manager):

   理論上任何可以存儲數據的軟件,都可以認為是資源管理器RM。最典型的RM就是關系型數據庫了,如mysql,另外一種比較常見的資源管理器是消息中間件,如ActiveMQ、RabbitMQ等, 這些都是真正的資源管理器。  

   事實上,將資源管理器(resource manager)稱為資源適配器(resource adapter)似乎更為合適。因為在java程序中,我們都是通過client來于RM進行交互的,例如:我們通過mysql-connector-java-x.x.x.jar驅動包,獲取Conn、執行sql,與mysql服務端進行通信;通過ActiveMQ、RabbitMQ等的客戶端,來發送消息等。

   正常情況下,一個數據庫驅動供應商只需要實現JDBC規范即可,一個消息中間件供應商只需要實現JMS規范即可。 而引入了分布式事務的概念后,DB、MQ等在DTP模型中的作用都是RM,二者是等價的,需要由TM統一進行協調。

   為此,JTA規范定義了一個XAResource接口,其定義RM必須要提供給TM調用的一些方法。之后,不管這個RM是DB,還是MQ,TM并不關心,因為其操作的是XAResource接口。而其他規范(如JDBC、JMS)的實現者,同時也對此接口進行實現。如MysqlXAConnection,就實現了XAResource接口。


通信資源管理器(Communication Resource Manager):

  這個是DTP模型中就已經存在的概念,對于需要跨應用的分布式事務,事務管理器彼此之間需要通信,這是就是通過CRM這個組件來完成的。JTA規范中,規定CRM需要實現JTS規范定義的接口。

   下圖更加直觀的演示了JTA規范中各個模型組件之間是如何交互的:

DE854E8B-2E11-4E63-9B21-111A501985B4.png


說明如下:

1、application 運行在application server中

2、application 需要訪問3個資源管理器(RM)上資源:1個MQ資源和2個DB資源。

3、由于這些資源服務器是獨立部署的,如果需要同時進行更新數據的話并保證一致性的話,則需要使用到分布式事務,需要有一個事務管理器來統一協調。

4、Application Server提供了事務管理器的功能

5、作為資源管理器的DB和MQ的客戶端驅動包,都實現了XAResource接口,以供事務管理器調用。

2 JTA規范--接口定義

JTA是java擴展包,在應用中需要額外引入相應的jar包依賴

  1. <dependency>

  2.    <groupId>javax.transaction</groupId>

  3.    <artifactId>jta</artifactId>

  4.    <version>1.1</version>

  5. </dependency>

JTA規范1.1中的源碼非常少,如下所示:

E137F669-A508-4120-9213-631278201DF3.png

可以看到,這里除了紅色框中包含的接口定義之外,其他全部是異常(XxxException),這里我們僅討論JTA規范中定義的接口作用:

       javax.transaction.Status:事務狀態,這個接口主要是定義一些表示事務狀態的常量,此接口無需實現

       javax.transaction.Synchronization:同步

       javax.transaction.Transaction:事務

       javax.transaction.TransactionManager:事務管理器

       javax.transaction.UserTransaction:用于聲明一個分布式事務

       javax.transaction.TransactionSynchronizationRegistry:事務同步注冊

       javax.transaction.xa.XAResource:定義RM提供給TM操作的接口

       javax.transaction.xa.Xid:事務id

    JTA規范中定義的這些接口,并不需要應用程序的開發人員去實現。而是由各個廠商去實現,根據在DTP模型中扮演的不同角色,需要實現不同的接口。

TM供應商:

   實現UserTransaction、TransactionManager、Transaction、TransactionSynchronizationRegistry、Synchronization、Xid接口,通過與XAResource接口交互來實現分布式事務。此外,TM廠商如果要支持跨應用的分布式事務,那么還要實現JTS規范定義的接口。

   常見的TM提供者包括我們前面提到的application server,包括:jboss、ejb server、weblogic等,以及一些以第三方類庫形式提供事務管理器功能的jotm、Atomikos。

RM供應商:

   XAResource接口需要由資源管理器者來實現,XAResource接口中定義了一些方法,這些方法將會被TM進行調用,如:

   start方法:開啟事務分支

   end方法:結束事務分支

   prepare方法:準備提交

   commit方法:提交

   rollback方法:回滾

   recover方法:列出所有處于PREPARED狀態的事務分支

   一些RM提供者,可能也會提供自己的Xid接口的實現。

 

此外,不同的資源管理器有一些各自的特定接口要實現:

   如JDBC2.0規范定義支持分布式事務的jdbc driver需要實現:javax.sql.XAConnection、javax.sql.XADataSource接口

   JMS1.0規范規定支持分布式事務的JMS廠商,需要實現javax.jms.XAConnection、javax.jms.XASession接口

注意:  作為DTP模型中Application開發者的我們,并不需要去實現任何JTA規范中定義的接口,只需要使用TM提供的UserTransaction實現,來聲明、提交、回滾一個分布式事務即可。

   以下案例演示了UserTransaction接口的基本使用:構建一個分布式事務,來操作位于2個不同的數據庫的數據,假設這兩個庫中都有一個user表。

  1. UserTransaction userTransaction=...

  2.        try{

  3.            //開啟分布式事務

  4.            userTransaction.begin();

  5.          

  6.            //執行事務分支1

  7.            conn1 = db1.getConnection();

  8.            ps1= conn1.prepareStatement("INSERT into user(name,age) VALUES ('tianshouzhi',23)");

  9.            ps1.executeUpdate();

  10.            

  11.            //執行事務分支2

  12.            conn2 = db2.getConnection();

  13.            ps2 = conn2.prepareStatement("INSERT into user(name,age) VALUES ('tianshouzhi',23)");

  14.            ps2.executeUpdate();

  15.            //提交,兩階段提交發生在這個方法內部

  16.            userTransaction.commit();

  17.        }catch (Exception e){

  18.            try {

  19.                userTransaction.rollback();//回滾

  20.            } catch (SystemException ignore) {

  21.            }

  22.        }

   需要注意的是,在分布式事務中,當我們需要提交或者回滾一個事務時,不應該再使用Connection接口提供的commit和rollback方法。而是應該使用UserTransaction接口的commit接口和rollback接口替代。

   另外,在本案例中,我們并沒有說明UserTransaction實例是如何構建的,這是由事務管理器(TM)實現者提供的,而目前我們還沒有接觸過任何事務管理器。


文章分類: 分布式事物
分享到:
支付寶贊助-Java幫幫社區
微信贊助-Java幫幫社區
Java幫幫公眾號生態

Java幫幫公眾號生態

總有一款適合你

Java幫幫-微信公眾號

Java幫幫-微信公眾號

將分享做到極致

Python幫幫-公眾號

Python幫幫-公眾號

人工智能,爬蟲,學習教程

大數據驛站-微信公眾號

大數據驛站-微信公眾號

一起在數據中成長

九點編程-公眾號

九點編程-公眾號

深夜九點學編程

程序員生活志-公眾號

程序員生活志-公眾號

互聯網,職場,程序員那些事兒

Java幫幫學習群生態

Java幫幫學習群生態

總有一款能幫到你

Java學習群

Java學習群

與大牛一起交流

大數據學習群

大數據學習群

在數據中成長

九點編程學習群

九點編程學習群

深夜九點學編程

python學習群

python學習群

人工智能,爬蟲

測試學習群

測試學習群

感受測試的魅力

Java幫幫生態承諾

Java幫幫生態承諾

一直堅守,不負重望

初心
勤儉
誠信
正義
分享
合作品牌 非盈利生態-優質內容分享傳播者
關于我們
友鏈申請
友鏈交換:加幫主QQ2524138991 留言即可 24小時內答復  
全站內容非商業用途,內容來源于網友,并遵循 許可,如有異議請聯系客服。
會員登錄
獲取驗證碼
登錄
登錄
我的資料
留言
回到頂部