系列目录

分布式事务(一)原理概览

分布式事务(二)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

分布式事务(二)Java事务API(JTA)规范的更多相关文章

  1. java事务 深入Java事务的原理与应用

    一.什么是JAVA事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (iso ...

  2. java事务(三)——自己实现分布式事务

    在上一篇<java事务(二)——本地事务>中已经提到了事务的类型,并对本地事务做了说明.而分布式事务是跨越多个数据源来对数据来进行访问和更新,在JAVA中是使用JTA(Java Trans ...

  3. Java事务与JTA

    一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么 ...

  4. 分布式事务二TCC

    分布式事务解决方案之TCC 4.1.什么是TCC事务 TCC是Try.Confirm.Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try.确认Confirm.撤销Cancel ...

  5. java事务(二)

    本地事务 事务类型 事务可以分为本地事务和分布式事务两种类型.这两种事务类型是根据访问并更新的数据资源的多少来进行区分的.本地事务是在单个数据源上进行数据的访问和更新,而分布式事务是跨越多个数据源来进 ...

  6. java事务(二)——本地事务

    本地事务 事务类型 事务可以分为本地事务和分布式事务两种类型.这两种事务类型是根据访问并更新的数据资源的多少来进行区分的.本地事务是在单个数据源上进行数据的访问和更新,而分布式事务是跨越多个数据源来进 ...

  7. redis教程(二)-----redis事务、记录日志到redis、分布式锁

    redis事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余 ...

  8. Java开发学习(二十二)----Spring事务属性、事务传播行为

    一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...

  9. 分布式事务解决方案(二)消息系统避免分布式事务 & MQ事务消息 & Sagas 事务模型

    参考文档: 如何用消息系统避免分布式事务:http://blog.jobbole.com/89140/ https://www.cnblogs.com/savorboard/p/distributed ...

随机推荐

  1. MVP 实践

    今天有时间看了看google的官方文档,下载todo源码,仔细研读了一下,觉得其思想对开发还是有很大帮助的.个人认为,MVP通过Activity与业务逻辑的解耦,其作为Controller的职责更加单 ...

  2. `TypeError: torch.mm received an invalid combination of arguments - got (torch.FloatTensor, Variable),

    `TypeError: torch.mm received an invalid combination of arguments - got (torch.FloatTensor, Variable ...

  3. python基础14_文件操作

    文件操作,通常是打开,读,写,追加等.主要涉及 编码 的问题. #!/usr/bin/env python # coding:utf-8 ## open实际上是从OS请求,得到文件句柄 f = ope ...

  4. 小试牛刀 WiFi 远控 + wendu

    废话 少说 直接上代码 DH11三根线  信号线 接2 WiFi 模块  r-------t t--------r en&vcc------3.3v 剩下的 共地的啦 double Fahre ...

  5. 北大poj- 1009

    Edge Detection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22835   Accepted: 5398 D ...

  6. c++ 集合的增删改查,与两集合的合并 缺陷(空间大小不灵活)

    #if 1 #include <iostream> #include <stdlib.h> using namespace std; class List { public: ...

  7. servlet之ServletRequest与ServletResponse (三)

    ·servlet的service()方法用于应答请求:每次请求都会调用service()方法 public void service(ServletRequest arg0, ServletRespo ...

  8. JS判断

    /***************************************************************** 表单校验工具类 (linjq) ***************** ...

  9. 微信公众号服务器配置url二次修改

    最近微信公众号配置的服务器的域名和云服务到期,就想着更换到别的域名下的服务器:修改的时候出现token验证失败: 我同样的微信签名验证代码在以前服务器上是没问题的,但是修改到新的域名地址时候,总是提醒 ...

  10. Python 列表(List)

    Python 列表(List) 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型 ...