在谈 JTA 事务之前先了解一下什么是事务和 JDBC 事务
事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,一个逻辑工作单元必须有四个属性:原子性、一致性、隔离性和持久性,又称 (ACID) 属性,只有这样才能成为一个事务。事务一般都是与数据库打交道的操作,其中的操作要么全做要么全都不做。
Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务和容器事务。其中JDBC的事务操作用法比较简单,适合于处理同一个数据源的操作。JTA事务相对复杂,可以用于处理跨多个数据库的事务,是分布式事务的一种解决方案。常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。
Java事务API由三个部分组成:
JDBC事务是单库的事务,是基于一个Connection的,在JDBC中是通过Connection对象进行事务管理。常用的和事务相关的方法是: setAutoCommit、commit、rollback等。
JDBC事务相对来说比较简单,主要就是通过JDBC API来控制数据库的事务执行。
优势:JDBC使用Java进行数据库的事务操作提供了最基本的支持。通过JDBC事务,我们可以将多个SQL语句放到同一个事务中,保证其ACID特性。JDBC事务的主要优点就是API比较简单,可以实现最基本的事务操作,性能也相对较好。
劣势:JDBC事务只能限于一个数据库连接!如果涉及到多数据库的操作或者分布式场景,JDBC事务就无能为力了。
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)。
要想使用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的事务,而且不支持自动提交。
优势:提供了分布式事务的解决方案,严格的ACID。
劣势:
提示:标准的JTA方式的事务管理在日常开发中并不常用。
虽然JTA事务是Java提供的可用于分布式事务的一套API,也可以同时管理多个数据源的事务,但由于JTA是通过两阶段(2PC)提交,暴露出的问题也非常明显,就是比较严重的性能问题,由于同时操作多个数据源;如果其中一个数据源获取数据的时间过长,会导致整个请求都非常的长,事务时间太长,锁数据的时间就会太长,自然就会导致低性能和低吞吐量。因此在实际开发过程中,对性能要求比较高的系统很少使用JTA组件做事务管理。
常用的分布式事务解决方案主要有异步消息确保型、TCC、最大努力通知等。
—————————
如有不足请留言指正
相互学习,共同进步