分佈式事務(二)Java事務API(JTA)規範

系列目錄

分佈式事務(一)原理概覽

分佈式事務(二)JTA規範

分佈式事務(三)mysql對XA協議的支持

分佈式事務(四)簡單樣例

分佈式事務(五)源碼詳解

分佈式事務(六)總結提高

一、引子

  既然出現了分佈式場景(DTP模型), 大java也及時制定出一套規範來給各大應用服務器、數據庫/mq等廠商使用,以方便管理互通---》JTA閃亮登場。JTA(Java Transaction API),即Java事務API規範。JTA規範指定了事務管理器(TM)與分佈式事務系統中涉及的各方(應用程序AP、資源管理器RM、應用服務器AS)之間的高級接口。JTA規範包含第一節講的XA規範,包含的那部分就是XA規範的java版本的實現。

oracle官方JTA規範:http://download.oracle.com/otn-pub/jcp/jta-1.1-spec-oth-JSpec/jta-1_1-spec.pdf  07年出版的。

二、JTA模型

規範中定義了JTA模型圖如下:

包括五個參與者:

  1. TM(transaction manager): 事務管理器提供支持事務界定、事務資源管理、同步和事務上下文傳播所需的服務和管理功能。
  2. AS(application server): 應用服務器提供了支持應用程序運行時環境所需的基礎設施,其中包括事務狀態管理。此類應用程序服務器的一個例子就是EJB服務器。jboss、weblogic、websphere等都是支持JTA規範的。注意:tomcat不支持JTA規範,所以只能使用第三方的TM庫,如JOTM和Atomikos。將TM直接整合進應用中,不再依賴於AS。
  3. RM(resource manager):資源管理器爲應用程序提供對資源的訪問。RM通過實現事務資源接口來參與分佈式事務。這個事務資源接口是給TM用於溝通事務關聯、事務完成和恢復工作的。例如關係數據庫服務器。
  4. AP(application program):一個基於組件的事務型應用程序,通過聲明性事務屬性設置提供事務管理支持。
  5. CRM(communication resource manager):通信資源管理器支持事務上下文傳播和對傳入和傳出請求的事務服務的訪問。JTA規範沒有指定與通信相關的要求。有關TM之間互操作性的更多細節,請參閱JTS規範。

爲了方便,本文後續使用簡稱。

分析

  • 1.核心模塊就是TM,分別與AP、AS、RM制定3個協議羣---》上圖桃紅色的半圓。
  • 2.TM的底層是JTS--》位於中間,桃紅色半圓下邊的支撐方塊。
  • 3.多個TM域之間依靠CRM溝通--》最下部的事務傳播、進出協議。

三、JTA接口

Java事務API由三個元素組成:高級應用程序事務界定接口、用於應用程序服務器的高級事務管理器接口和用於事務資源管理器的X/Open XA協議的標準Java映射。

咱們以jta基礎包1.1版本爲準,引入maven pom.xml中引入依賴 :(jta這個artifactId是被引用多的,spring也直接引用了。)

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>jta</artifactId>
    <version>1.1</version>
</dependency>

maven導入包後,包結構如下:

一共8個接口:

  1. XAResource:XA資源管理器接口,RM提供給TM調用。XAResource接口是基於X/Open CAE規範(分佈式事務處理:XA規範)的行業標準XA接口的Java映射。
  2. Xid:Xid接口是X/Open事務標識Xid結構的Java映射。此接口指定三個方法:,分別獲取:全局事務的格式化ID、全局事務ID和分支限定符。TM和RM使用Xid接口。此接口對AP和AS都不可見。
  3. Status:定義事務狀態。共指定10個狀態
  4. Synchronization:同步接口。事務同步允許AS在事務完成之前和之後從TM獲得通知。
  5. Transaction:事務定義接口。每個全局事務都與一個事務對象關聯。
  6. TransactionManager:事務管理器。管理事務的全生命週期。
  7. TransactionSynchronizationRegistry:事務同步註冊器。用於系統級AS組件(如持久化管理器)。這提供了註冊具有特殊排序語義的同步對象、將資源對象與當前事務關聯、獲取當前事務的事務上下文、獲取當前事務狀態以及將當前事務標記爲回滾的能力。
  8. UserTransaction:事務客戶端,封裝了用戶可直接操作事務的接口。

注意

這些接口都不需要開發者去實現:

  • XAResource、Xid 由數據庫廠商實現。
  • TransactionManager、UserTransaction等操作事務相關的接口由AS廠商實現(例如web服務就是jboss、weblogic,或者第三方事務類庫jotm、Atomikos)。

用戶只需要使用UserTransaction的實現類來操控事務的創建、提交、回滾即可,是不是輕鬆加愉快- -!當然簡單點直接使用註解也是可以的。

四、 AS對JTA的支持

本節基於2個條件分析AS對JTA的支持。

1.應用程序的事務和資源使用由AS管理。

2.對底層TM的訪問是通過資源適配器實現的。例如,可以使用JDBC 2.0驅動程序訪問關係數據庫(底層通過connection管理事務資源)

4.1 典型場景

如上圖:

1. 上圖底部藍色方框:RM+Adapter適配器.AS調用Adapter來創建TransactionalResource對象。TransactionalResource關聯2個對象:一個對象實現Connection接口,另一個實現javax.transaction.xa.XAResource接口。
2.上圖中部紅色方框:AS獲取一個TransactionalResource對象,通過getXAResource方法獲得XAResource對象。AS使用Transaction.enlistResource()方法將XAResource註冊到TM。
3.上圖左上角:TM調用XAResource.start()方法,通過Connection,將執行的工作與事務關聯起來。
4.上圖右上角:AP調用AS的getConnection()方法來獲取Connection對象,執行業務操作。

4.2 時序圖

附上時序圖如下:

1.AS調用TM的start()方法開啓一個事務。

2.Ap調用AS的getConnection()方法獲取Connection。

3.AS調用RM適配器的ResourceFactory.getTransactionalResource()獲取TransactionalResource對象(內部new 一個Connection,new 一個XAResource)

4.AS調用RM適配器getXAResource()方法獲取XAResource。

5.AS調用TM的enlistResource()方法把XAResource註冊到TM中。

6.TM調用start()方法把當前事務關聯到XAResource上。

7.AS調用TransactionalResource的getConnection()方法,並返回Connection給AP。

8.Ap通過這個Connection執行操作。執行完畢後close 這個connection。

9.RM適配器通知AS connection 已經close,AS調用TM的delistResouce()刪除這些XAResource。

10.TM調用XAResource.end()方法,將事務與XAResource分離。

11.AS調用TM的commit()方法,提交事務。

12.TM調用XAResource.prepare()方法,通知RM預提交事務。

13.TM調用XAResource.commit()方法,通知RM提交事務。

 

 

 

====參考========

http://www.tianshouzhi.com/api/tutorials/distributed_transaction/385

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