JTA规范事务模型

Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了分布式事务服务(distributed transaction)的能力。某种程度上,可以认为JTA规范是XA规范的Java版,其把XA规范中规定的DTP模型交互接口抽象成Java接口中的方法,并规定每个方法要实现什么样的功能。

在DTP模型中,规定了模型的五个组成元素:应用程序(Application)、资源管理器(Resource Manager)、事务管理器(Transaction Manager)、通信资源管理器(Communication Resource Manager)、 通信协议(Communication Protocol)。

而在JTA规范中,模型中又多了一个元素Application Server,如下所示:

下面介绍一下在JTA规范中,模型中各个组件的作用:

事务管理器(transaction manager):

处于图中最为核心的位置,其他的事务参与者都是与事务管理器进行交互。事务了管理器提供事务声明,事务资源管理,同步,事务上下文传播等功能。JTA规范定义了事务管理器与其他事务参与者交互的接口,而JTS规范定义了事务管理器的实现要求,因此我们看到事务管理器底层是基于JTS的。

应用服务器(application server):

顾名思义,是应用程序运行的容器。JTA规范规定,事务管理器的功能应该由application server提供,如上图中的EJB Server。一些常见的其他web容器,如:jboss、weblogic、websphere等,都可以作为application server,这些web容器都实现了JTA规范。特别需要注意的是,并不是所有的web容器都实现了JTA规范,如tomcat并没有实现JTA规范,因此并不能提供事务管理器的功能。

应用程序(application):

简单来说,就是我们自己编写的应用,部署到了实现了JTA规范的application server中,之后我们就可以我们JTA规范中定义的UserTransaction类来声明一个分布式事务。通常情况下,application server为了简化开发者的工作量,并不一定要求开发者使用UserTransaction来声明一个事务,开发者可以在需要使用分布式事务的方法上添加一个注解,就像spring的声明式事务一样,来声明一个分布式事务。

特别需要注意的是,JTA规范规定事务管理器的功能由application server提供。但是如果我们的应用不是一个web应用,而是一个本地应用,不需要被部署到application server中,无法使用application server提供的事务管理器功能。又或者我们使用的web容器并没有事务管理器的功能,如tomcat。对于这些情况,我们可以直接使用一些第三方的事务管理器类库,如JOTM和Atomikos。将事务管理器直接整合进应用中,不再依赖于application server。

资源管理器(resource manager):

理论上任何可以存储数据的软件,都可以认为是资源管理器RM。最典型的RM就是关系型数据库了,如mysql,另外一种比较常见的资源管理器是消息中间件,如ActiveMQ、RabbitMQ等, 这些都是真正的资源管理器。

事实上,将资源管理器(resource manager)称为资源适配器(resource adapter)似乎更为合适。因为在java程序中,我们都是通过client来于RM进行交互的,例如:我们通过mysql-connector-java-x.x.x.jar驱动包,获取Conn、执行sql,与mysql服务端进行通信;通过ActiveMQ、RabbitMQ等的客户端,来发送消息等。

正常情况下,一个数据库驱动供应商只需要实现JDBC规范即可,一个消息中间件供应商只需要实现JMS规范即可。 而引入了分布式事务的概念后,DB、MQ等在DTP模型中的作用都是RM,二者是等价的,需要由TM统一进行协调。

为此,JTA规范定义了一个XAResource接口,其定义RM必须要提供给TM调用的一些方法。之后,不管这个RM是DB,还是MQ,TM并不关心,因为其操作的是XAResource接口。而其他规范(如JDBC、JMS)的实现者,同时也对此接口进行实现。如MysqlXAConnection,就实现了XAResource接口。

通信资源管理器(Communication Resource Manager):

这个是DTP模型中就已经存在的概念,对于需要跨应用的分布式事务,事务管理器彼此之间需要通信,这是就是通过CRM这个组件来完成的。JTA规范中,规定CRM需要实现JTS规范定义的接口。

下图更加直观的演示了JTA规范中各个模型组件之间是如何交互的:

说明如下:

1、application 运行在application server中

2、application 需要访问3个资源管理器(RM)上资源:1个MQ资源和2个DB资源。

3、由于这些资源服务器是独立部署的,如果需要同时进行更新数据的话并保证一致性的话,则需要使用到分布式事务,需要有一个事务管理器来统一协调。

4、Application Server提供了事务管理器的功能

5、作为资源管理器的DB和MQ的客户端驱动包,都实现了XAResource接口,以供事务管理器调用。

2 JTA规范--接口定义

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

javax.transaction

jta

1.1

JTA规范1.1中的源码非常少,如下所示:

可以看到,这里除了红色框中包含的接口定义之外,其他全部是异常(XxxException),这里我们仅讨论JTA规范中定义的接口作用:

javax.transaction.Status:事务状态,这个接口主要是定义一些表示事务状态的常量,此接口无需实现

javax.transaction.Synchronization:同步

javax.transaction.Transaction:事务

javax.transaction.TransactionManager:事务管理器

javax.transaction.UserTransaction:用于声明一个分布式事务

javax.transaction.TransactionSynchronizationRegistry:事务同步注册

javax.transaction.xa.XAResource:定义RM提供给TM操作的接口

javax.transaction.xa.Xid:事务id

JTA规范中定义的这些接口,并不需要应用程序的开发人员去实现。而是由各个厂商去实现,根据在DTP模型中扮演的不同角色,需要实现不同的接口。

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接口

注意:  作为DTP模型中Application开发者的我们,并不需要去实现任何JTA规范中定义的接口,只需要使用TM提供的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) {

}

}

需要注意的是,在分布式事务中,当我们需要提交或者回滚一个事务时,不应该再使用Connection接口提供的commit和rollback方法。而是应该使用UserTransaction接口的commit接口和rollback接口替代。

另外,在本案例中,我们并没有说明UserTransaction实例是如何构建的,这是由事务管理器(TM)实现者提供的,而目前我们还没有接触过任何事务管理器。

在下一节中,我们将通过atomikos这个事务管理器,来演示一个真实的分布式事务案例。

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

  1. hive java udf_UDF_Hive教程_田守枝Java技术博客

    UDF是User-Defined Functions(用户定义函数)的简称. 通过以下命令可以查看HIVE中函数的相关文档:SHOW FUNCTIONS; DESCRIBE FUNCTION ; DE ...

  2. c语言用十年算入门,初识C语言_十年饮冰 难凉热血的技术博客_51CTO博客

    今天学习了C语言的字符串和转义字符:我总结了如下的一些知识点来和初学C语言的小伙伴们 分享一下!也希望能得到大家的指点或者能和大家一起讨论! 字符串的定义:"hello"像这种由双 ...

  3. 分布式系统漫谈【拾】_分布式事务一致性:阿里方案

    上篇文章:分布式系统漫谈[玖]_分布式事务一致性:协议支持 其实对于生产环境的分布式事务一致,各大互联网公司都是自己实现的解决方案,总结起来无非是异步.补偿.实时查询.定期校对几种模式,大部分场景都是 ...

  4. mysql分布式事务wcf_[转载]WCF系列_分布式事务(下)

    浏览到chnking的WCF的分布式事务处理不错,转载过来分享一下.1. WCF分布式事务例子这里也用转账的例子说事. 用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B ...

  5. 一致 先验分布 后验分布_分布式事务常见解决方案与最终一致性

    小编推荐:互联网大背景下,微服务盛行,平时开发中难免会遇到分布式事务问题.大家经常会听到CAP原理,即一致性(Consistency).可用性(Availability).分区容错性(Partitio ...

  6. java web论文_(定稿)毕业论文基于JavaWeb技术博客项目的设计论文(完整版)最新版...

    <[毕业论文]基于Java Web技术博客项目的设计论文.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)毕业论文基于Java Web技术博客项目的设计论文(完整版)> ...

  7. python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客

    python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客 python脚本监控网站状态 2013-01-09 09:21:02 标签:监控 python 原创作品,允许转载,转载时请 ...

  8. hexo评论_【前端简历加分】hexo框架搭建个人博客站点,手把手教学

    最近,粉丝们在金九银十期间也是不断的面试,有比较多的毕业生说我在这个期间出多一些面试题,上几期都是倾向于面试文章,这期出一次简历加分项操作,使用hexo框架搭建个人博客. 作为应届毕业生或者1-3年工 ...

  9. 开发记录_自学Python写爬虫程序爬取csdn个人博客信息

    每天刷开csdn的博客,看到一整个页面,其实对我而言,我只想看看访问量有没有上涨而已... 于是萌生了一个想法: 想写一个爬虫程序把csdn博客上边的访问量和评论数都爬下来. 打算通过网络各种搜集资料 ...

最新文章

  1. 怎么查询redis缓存的数据_阿里开发十年写出这份「Redis简明教程」+「Redis实战」请你查收...
  2. websocket 历史及使用详解
  3. 深度学习:dropout和BN的实现
  4. Linux多线程同步
  5. 5.2g信道用哪个好_记工记账软件哪个比较实用?建筑工地用哪个记工记账软件好?...
  6. Win32 Application和Win32 Console Application
  7. 资料汇总更新|FPGA软件安装包、书籍、源码、技术文档…(2021.01.04更新)
  8. 认识网络、几种常用的网络拓扑图
  9. scrapy 搜索关键字_基于scrapy框架输入关键字爬取有关贴吧帖子
  10. KNN算法优缺点总结,以及机器学习流程的总结
  11. 阿里云oss中解决IE浏览器下载中文文件时乱码问题
  12. 操作系统重要知识清单:一起来搞懂进程呀!!
  13. 与dalao学校的联shou考wan(11.2)(dp+乱搞+树形dp+期望)
  14. 自媒体新人怎么写文章赚钱?哪个平台收益高?教你快速通过新手期!
  15. 计算机vf的讲解,计算机二级《VFP》知识点讲解:查询和视图
  16. 生成伪随机数的函数int rand(void)和void srand(unsigned seed);
  17. 国务院正式批准长三角规划:将建世界级城市群
  18. 中文开源汉语分词工具
  19. chrome浏览器发布文章(发贴)辅助的实现思路
  20. 金士顿内存条验证真伪

热门文章

  1. 科大讯飞会是典型的AI泡沫吗
  2. 集中式数据库性能优化
  3. 微信小程序(游戏)----五子棋(棋盘,重置,对弈)
  4. Kibana(Windows版本)
  5. Arduino—四位七段码显示
  6. wifi boombox android,15天+19项 15款蓝牙音响史上最严苛横评
  7. 华为开发鸿蒙的历程,关于华为鸿蒙系统那些事儿
  8. java poi读取excel,2147483647问题
  9. ASCII 码表及说明
  10. 第一性原理分析Swarm的经济激励