正文
既然出现了分布式场景(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模型图如下:
包括五个参与者:
为了方便,本文后续使用简称。
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
原文:https://www.cnblogs.com/shoshana-kong/p/14029552.html