在介绍这两个概念之前,我们先看看是什么是X/Open DTP模型

X/Open

X/Open,即现在的open group,是一个独立的组织,主要负责制定各种行业技术标准。X/Open组织主要由各大知名公司或者厂商进行支持,这些组织不光遵循X/Open组织定义的行业技术标准,也参与到标准的制定。

官网地址:http://www.opengroup.org/

X/Open DTP 全称 X/Open Distributed Transaction Processing Reference是X/Open这个组织定义出的一套分布式事务标准。

DTP参考模型:https://pubs.opengroup.org/onlinepubs/9294999599/toc.pdf

X/Open DTP模型组成

X/Open DTP 定义了三个组件:AP,TM,RM 和两个协议:XA、TX

AP(Application Program):也就是应用程序,可以理解为使用DTP的程序

RM(Resource Manager):资源管理器,这里可以理解为一个DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器对资源进行控制。

TM(Transaction Manager):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器。

XA协议:应用或应用服务器与事务管理之前通信的接口

TX协议:全局事务管理器与资源管理器之间通信的接口

编程方式

1. 配置TM,通过TM或者RM提供的方式,把RM注册到TM。可以理解为给TM注册RM作为数据源。一个TM可以注册多个RM。

1. AP从TM获取资源管理器的代理(例如:使用JTA接口,从TM管理的上下文中,获取出这个TM所管理的RM的JDBC连接或JMS连接)

2. AP向TM发起一个全局事务。这时,TM会通知各个RM。XID(全局事务ID)会通知到各个RM。

3. AP通过1中获取的连接,直接操作RM进行业务操作。这时,AP在每次操作时把XID(包括所属分支的信息)传递给RM,RM正是通过这个XID与2步中的XID关联来知道操作和事务的关系的。

4. AP结束全局事务。此时TM会通知RM全局事务结束。

5. 开始二段提交,也就是prepare - commit的过程。

XA协议

如上图所示,XA规范的最主要的作用是,就是定义了RM-TM的交互接口。下图更加清晰了演示了XA规范在DTP模型中发挥作用的位置。

其实这个协议只是定义了xa_和ax_系列的函数原型以及功能描述、约束和实施规范等。至于RM和TM之间通过什么协议通信,则没有提及。目前知名的数据库,如Oracle, DB2等,都是实现了XA接口的,都可以作为RM。XA规范除了定义的RM-TM交互的接口(XA Interface)之外,还对两阶段提交协议进行了优化。两阶段提交和三阶段提交这里不做介绍了。

XA规范中定义的RM 和 TM交互的接口如下图所示:

JTA

上述接口规范不是针对某种语言的,java是如何来落实上述规范的呢?这就是JTA的内容了。

JTA:Java Transaction API, Java事务API。

oracle官方JTA规范:https://download.oracle.com/otn-pub/jcp/jta-1.1-spec-oth-JSpec/jta-1_1-spec.pdf?AuthParam=1607398216_8fd3922762196dfe6e8b27eb50190cc1

规范中定义了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规范。

JTA接口

JTA是java扩展包,在应用中需要额外引入相应的jar包依赖

       javax.transaction       jta       1.1

一共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的实现类来操控事务的创建、提交、回滚即可,是不是轻松加愉快- -!当然简单点直接使用注解也是可以的。

TM供应商:

实现UserTransaction、TransactionManager、Transaction、TransactionSynchronizationRegistry、Synchronization、Xid接口,通过与XAResource接口交互来实现分布式事务。此外,TM厂商如果要支持跨应用的分布式事务,那么还要实现JTS规范定义的接口。

常见的TM提供者包括我们前面提到的application server,包括:jboss、ejb server、weblogic等,以及一些以第三方类库形式提供事务管理器功能的jotm、Atomikos。

RM供应商:

XAResource接口需要由资源管理器者来实现,XAResource接口中定义了一些方法,这些方法将会被TM进行调用,如:

start方法:开启事务分支

end方法:结束事务分支

prepare方法:准备提交

commit方法:提交

rollback方法:回滚

recover方法:列出所有处于PREPARED状态的事务分支

一些RM提供者,可能也会提供自己的Xid接口的实现。

此外,不同的资源管理器有一些各自的特定接口要实现:

如JDBC2.0规范定义支持分布式事务的jdbc driver需要实现:javax.sql.XAConnection、javax.sql.XADataSource接口

JMS1.0规范规定支持分布式事务的JMS厂商,需要实现javax.jms.XAConnection、javax.jms.XASession接口

开发者

用户只需要使用UserTransaction的实现类来操控事务的创建、提交、回滚即可。

以下案例演示了UserTransaction接口的基本使用:构建一个分布式事务,来操作位于2个不同的数据库的数据,假设这两个库中都有一个user表。

    UserTransaction userTransaction=...            try{                //开启分布式事务                userTransaction.begin();                                //执行事务分支1                conn1 = db1.getConnection();                ps1= conn1.prepareStatement("INSERT into user(name,age) VALUES ('tianshouzhi',23)");                ps1.executeUpdate();                                //执行事务分支2                conn2 = db2.getConnection();                ps2 = conn2.prepareStatement("INSERT into user(name,age) VALUES ('tianshouzhi',23)");                ps2.executeUpdate();                //提交,两阶段提交发生在这个方法内部                userTransaction.commit();            }catch (Exception e){                try {                    userTransaction.rollback();//回滚                } catch (SystemException ignore) {                }            }

AS对JTA的支持

基于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提交事务。

参考博客:

https://www.cnblogs.com/dennyzhangdd/p/10638201.html;

http://www.tianshouzhi.com/api/tutorials/distributed_transaction/385;

spring整合atomikos实现分布式事务的方法示例_分布式事务中的XA和JTA相关推荐

  1. spring整合atomikos实现分布式事务的方法示例_分布式-分布式事务处理

    在之前的文章"如何合理的使用动态数据源"中,其实也提到了分布式事务相关的场景如:利用多数据源实现读写分离,但直接使用动态数据源频繁其实是很消耗资源的,而且就是当业务service一 ...

  2. spring整合atomikos实现分布式事务的方法示例_分布式事务一:基于数据库原生分布式事务方案实现...

    1.分布式事务模型 ACID 实现 1.1.X/Open XA 协议(XA) 最早的分布式事务模型是 X/Open 国际联盟提出的 X/Open Distributed Transaction Pro ...

  3. python中使用grpc方法示例_在Python中使用gRPC的方法示例

    本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip pip install grpcio pip i ...

  4. java分布式事务 实例_spring整合atomikos实现分布式事务的方法示例

    前言 Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,主要用于处理跨数据库事务,比如某个指令在A库和B库都有写操作,业务上要求A库和B库的写操作要具有原子性,这时候就可以用到 ...

  5. 分布式模块之间的调用_分布式事务

    一.什么是分布式事务: 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上. 比如说:电商系统中的订单系统与库存系统 图中包含了库存和订单两个 ...

  6. python分布式爬虫及数据存储_分布式爬虫

    爬虫学习使用指南 Auth: 王海飞 Data:2018-07-05 Email:779598160@qq.com github:https://github.com/coco369/knowledg ...

  7. java方法示例注释 @_Java 8中的功能接口是什么? @功能注释和示例

    java方法示例注释 @ 函数接口是Java 8最重要的概念之一,实际上为lambda表达式提供了动力,但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它,并花时间学习l ...

  8. 抽象工厂和工厂方法示例_工厂方法设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  9. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

最新文章

  1. MySQL数据库多种安装方法及企业级安装实践
  2. 在大规模系统中使用Scala
  3. 【UOJ188】 Sanrd【类min_25筛】
  4. VC设置CEdit控件背景透明、文字背景也透明
  5. android shape 圆角百分比,Android shape显示圆角问题
  6. HDFS balancer 异常处理
  7. 转(HP大中华区总裁孙振耀退休感言)
  8. Perl语言入门,第17章自写习题答案。
  9. html表单代码有哪些,HTML常用代码有哪些
  10. cydia所有中文源地址_Cydia中文源大全.doc
  11. Handler机制原理----全解
  12. VIX 指数构造详细证明过程
  13. 医学人工智能读书会与黄智生教授简历(公号回复“医学AI读书会”下载PDF资料,欢迎转发、赞赏、支持科普)
  14. MAVEN使用中 error role: org.apache.maven.model.validation.ModelValidato...
  15. 【物理】半导体物理 西安电子科技大学 柴常春等主讲-[笔记P15-P18]
  16. 什么是大数据,大数据工具有那些,大数据流程是什么样的 一
  17. 微信小程序--给头像添加logo(生成海报同理)
  18. 在线乐谱协作编辑器composing.studio
  19. GRE词汇统计大全(一)
  20. 基础面试题:java内存区域

热门文章

  1. java 设计模式 优缺点_java设计模式2:原型模式(机制\优缺点分析\使用场景)...
  2. python开发工具管理系统_Python开发桌面软件文档及网址管理工具,强迫症的福音...
  3. python给多个子图加总标题
  4. 机器学习中的相似性度量总结
  5. QT学习笔记(二):QT MinGW 和 MSVC 编译方式
  6. Windows10+Ubuntu 18.04.2+ROS 安装笔记(SSD单硬盘)下
  7. QT中的QTableView+QTableWidget
  8. Android实现高仿QQ附近的人搜索展示
  9. php代码加文件后缀,php中一行代码获取文件后缀名
  10. mysql数值类型占用字节及范围_mysql数据类型及占用字节数【mysql】