分佈式事務(一)原理概覽html
分佈式事務(二)JTA規範java
分佈式事務(四)簡單樣例web
分佈式事務(五)源碼詳解spring
分佈式事務(六)總結提升sql
既然出現了分佈式場景(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年出版的。api
規範中定義了JTA模型圖以下:tomcat
包括五個參與者:服務器
爲了方便,本文後續使用簡稱。
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個接口:
注意:
這些接口都不須要開發者去實現:
用戶只須要使用UserTransaction的實現類來操控事務的建立、提交、回滾便可,是否是輕鬆加愉快- -!固然簡單點直接使用註解也是能夠的。
本節基於2個條件分析AS對JTA的支持。
1.應用程序的事務和資源使用由AS管理。
2.對底層TM的訪問是經過資源適配器實現的。例如,可使用JDBC 2.0驅動程序訪問關係數據庫(底層經過connection管理事務資源)
如上圖:
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對象,執行業務操做。
附上時序圖以下:
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