系列目錄
一、引子
既然出現了分布式場景(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模型圖如下:
包括五個參與者:
- TM(transaction manager): 事務管理器提供支持事務界定、事務資源管理、同步和事務上下文傳播所需的服務和管理功能。
- AS(application server): 應用服務器提供了支持應用程序運行時環境所需的基礎設施,其中包括事務狀態管理。此類應用程序服務器的一個例子就是EJB服務器。jboss、weblogic、websphere等都是支持JTA規范的。注意:tomcat不支持JTA規范,所以只能使用第三方的TM庫,如JOTM和Atomikos。將TM直接整合進應用中,不再依賴於AS。
- RM(resource manager):資源管理器為應用程序提供對資源的訪問。RM通過實現事務資源接口來參與分布式事務。這個事務資源接口是給TM用於溝通事務關聯、事務完成和恢復工作的。例如關系數據庫服務器。
- AP(application program):一個基於組件的事務型應用程序,通過聲明性事務屬性設置提供事務管理支持。
- 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個接口:
- XAResource:XA資源管理器接口,RM提供給TM調用。XAResource接口是基於X/Open CAE規范(分布式事務處理:XA規范)的行業標准XA接口的Java映射。
- Xid:Xid接口是X/Open事務標識Xid結構的Java映射。此接口指定三個方法:,分別獲取:全局事務的格式化ID、全局事務ID和分支限定符。TM和RM使用Xid接口。此接口對AP和AS都不可見。
- Status:定義事務狀態。共指定10個狀態
- Synchronization:同步接口。事務同步允許AS在事務完成之前和之后從TM獲得通知。
- Transaction:事務定義接口。每個全局事務都與一個事務對象關聯。
- TransactionManager:事務管理器。管理事務的全生命周期。
- TransactionSynchronizationRegistry:事務同步注冊器。用於系統級AS組件(如持久化管理器)。這提供了注冊具有特殊排序語義的同步對象、將資源對象與當前事務關聯、獲取當前事務的事務上下文、獲取當前事務狀態以及將當前事務標記為回滾的能力。
- 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