浅谈 JTA 事务

分享知识 传递快乐

 

在谈 JTA 事务之前先了解一下什么是事务和 JDBC 事务

 

事务

事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,一个逻辑工作单元必须有四个属性:原子性、一致性、隔离性和持久性,又称 (ACID) 属性,只有这样才能成为一个事务。事务一般都是与数据库打交道的操作,其中的操作要么全做要么全都不做。

Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务和容器事务。其中JDBC的事务操作用法比较简单,适合于处理同一个数据源的操作。JTA事务相对复杂,可以用于处理跨多个数据库的事务,是分布式事务的一种解决方案。常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。

 

Java事务API

Java事务API由三个部分组成:

  • UserTransaction - 高层的应用事务划分接口,供客户程序使用
  • TransactionManager - 高层的事务管理器接口,供应用服务器使用
  • XAResource,X/Open XA协议的标准Java映射,供事务性资源管理器使用。

 

JDBC事务

JDBC事务是单库的事务,是基于一个Connection的,在JDBC中是通过Connection对象进行事务管理。常用的和事务相关的方法是: setAutoCommit、commit、rollback等。

JDBC事务相对来说比较简单,主要就是通过JDBC API来控制数据库的事务执行。

 

JDBC事务的优缺点

优势:JDBC使用Java进行数据库的事务操作提供了最基本的支持。通过JDBC事务,我们可以将多个SQL语句放到同一个事务中,保证其ACID特性。JDBC事务的主要优点就是API比较简单,可以实现最基本的事务操作,性能也相对较好。

劣势:JDBC事务只能限于一个数据库连接!如果涉及到多数据库的操作或者分布式场景,JDBC事务就无能为力了。

 

JTA事务

什么是JTA事务

Java事务API(Java Transaction API,简称JTA )是一个J2EE的应用程序接口,在Java环境中,JTA允许应用程序完成跨越多个XA资源的分布式事务,即在两个或多个资源上访问并且更新数据。JDBC驱动程序对JTA的支持极大地增强了数据访问能力。

XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用Spring JTA接口即可实现JTA事务管理功能。JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。

 

分布式事务

分布式事务(Distributed Transaction)包括事务管理器(Transaction Manager)和一个或多个支持 XA 协议的资源管理器 (Resource Manager)。

  • 事务管理器(Transaction Manager)提供事务声明,事务资源管理,事务同步,事务上下文传播等功能,并且负责着所有事务参与单元者的相互通讯的责任。JTA规范定义了事务管理器与其他事务参与者交互的接口,其他的事务参与者与事务管理器进行交互。
  • 资源管理器(Resource Manager)是任意类型的持久化数据存储容器;

要想使用JTA事务,就必须遵守XA规范;需要实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。XAConnection 是参与 JTA 事务的 JDBC 连接。只有使用 XADataSource 来产生数据库连接,产生的连接为一个XA连接。

XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。

 

JTA的优缺点

优势:提供了分布式事务的解决方案,严格的ACID。

劣势:

  • 实现复杂
  • 通常情况下 JTA UserTransaction 需要从JNDI获取。这意味着,如果我们使用JTA,就需要同时使用JTA和JNDI。
  • JTA本身就是个笨重的API
  • 通常JTA只能在应用服务器环境下使用,因此使用JTA会限制代码的复用性。

提示:标准的JTA方式的事务管理在日常开发中并不常用。

 

虽然JTA事务是Java提供的可用于分布式事务的一套API,也可以同时管理多个数据源的事务,但由于JTA是通过两阶段(2PC)提交,暴露出的问题也非常明显,就是比较严重的性能问题,由于同时操作多个数据源;如果其中一个数据源获取数据的时间过长,会导致整个请求都非常的长,事务时间太长,锁数据的时间就会太长,自然就会导致低性能和低吞吐量。因此在实际开发过程中,对性能要求比较高的系统很少使用JTA组件做事务管理。

常用的分布式事务解决方案主要有异步消息确保型、TCC、最大努力通知等。

 

 

 

 

 

 

 

 

 

—————————
如有不足请留言指正
相互学习,共同进步

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值