java jta_分布式事务(二)Java事务API(JTA)规范

zz/2024/4/13 14:47:24

一、引子

既然出现了分布式场景(DTP模型), 大java也及时制定出一套规范来给各大应用服务器、数据库/mq等厂商使用,以方便管理互通---》JTA闪亮登场。JTA(Java Transaction API),即Java事务API规范。JTA规范指定了事务管理器(TM)与分布式事务系统中涉及的各方(应用程序AP、资源管理器RM、应用服务器AS)之间的高级接口。JTA规范包含第一节讲的XA规范,包含的那部分就是XA规范的java版本的实现。

二、JTA模型

规范中定义了JTA模型图如下:

4c782e076adab9140eed0fe7a65a5f52.png

包括五个参与者:

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也直接引用了。)

javax.transaction

jta

1.1

maven导入包后,包结构如下:

8d9186b5b29c6fe8771134d1c3698cde.png

一共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 典型场景

11441e1b3d9d332d9578bf0df70503dd.png

如上图:

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 时序图

附上时序图如下:

1864a13b2aca69bba550a41fc95d9113.png

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

欢迎关注微信公众号:shoshana


http://www.ngui.cc/zz/1568526.html

相关文章

JavaEE之JTA

Java事务API。允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。事务最简单最直接的目的就是保证数据的有效性,数据的一致性。个人理解:JTA事务比JDBC事务更强大。一个…

SpringBoot整合JTA

导读JTA,即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。 JTA是基于XA标准制定的,采用两阶段提交的方式来管理分布式事务。即…

JTA处理事务

什么是事务处理 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。关于事务最经典的示例莫过于信用卡转账:将用户 A 账户中的 500 元人民币转移…

jboss jta mysql_JBoss下的JTA使用理解

先给出通过JBoss容器获取JTA事务的方法private UserTransaction getUserTransaction() throws ServletException {UserTransaction ut;try {InitialContext ic new InitialContext();//comp java:/UserTransaction ut (UserTransaction) ic.lookup("java:comp/UserTrans…

java jta_JTA规范_分布式事务教程_田守枝Java技术博客

JTA规范事务模型Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了分布式事务服务(distributed transaction)的能力。某种程度上,可以认为JTA规范是XA规范的Java版&a…

Java事务--JTA原理

上一篇文章介绍了JDBC事务,JDBC可以处理单数据源的事务,满足大部分事务处理的需求,但是JDBC事务不能解决多数据源和分布式事务问题,Java平台给我们提供了解决方案--JTA。本文将探讨JTA的一些细节。 一 分布式事务 通常把一…

java jta_java-“ jta-datasource”和“ resource-local”数据源之间的区别?

术语“ jta-data source”和“ resource-local datasource”对我来说有点模糊。我猜您实际上是指EntityManagerFactory和JTA元素。 简而言之:如果持久性单元的事务类型为JTA,则EntityManagerFactory元素用于声明将用于获得连接的JTA数据源的JNDI名称。 这…

jta mysql_springboot + jta + mysql + mongo 分布式(多种数据源)事务

该文章讲的不是仅mysql的多数据源。环境:mysql: 5.1.27mongodb: 4.2.2springboot: 2.2.2在前n天遇到一个业务是用到mysql和mongo。都有写操作,想到急需一个事务管理的东东,上网搜了一遍,发现mysql和mongo是各自独立事务管理的。mo…

java jta_JAVA事务系列三:JTA事务

什么是JTA?JTA全称Java Transaction API ,即Java事务API,英文解释: Java Transaction API (JTA) specifies standard Java interfaces between a transaction manager and the parties involved in a distributed transaction sys…

jta事物

JDBC可以处理单数据源的事务,满足大部分事务处理的需求,但是JDBC事务不能解决多数据源和分布式事务问题,Java平台给我们提供了解决方案--JTA。本文将探讨JTA的一些细节。一 分布式事务 通常把一个数据库内部的事务处理,如对…