Java事务API(Java Transaction API,简称JTA ) 是一个Java企业版 的应用程序接口,
JTA和它的同胞Java事务服务(JTS;Java TransactionService),为J2EE平台提供了分布式事务服务。不过JTA只是提供了一个接口,并没有提供具体的实现,而是由j2ee服务器提供商 根据JTS规范提供的,常见的JTA实现有以下几种:
(1) J2EE容器所提供的JTA实现(JBoss)。
(2) 独立的JTA实现:如JOTM,Atomikos.这些实现可以应用在那些不使用J2EE应用服务器的环境里用以提供分布事事务保证。如Tomcat,Jetty以及普通的java应用。
关于分布式事务、两阶段提交协议、三阶提交协议
Java中的事务——JDBC事务和JTA事务
JTA实现分布式事务原理
参考文章:JTA 深度历险 - 原理与实现
要理解 JTA 的实现原理首先需要了解其架构:它包括事务管理器(
Transaction Manager
)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager )
两部分, 我们可以将资源管理器看做任意类型的持久化数据存储
;事务管理器
则承担着所有事务参与单元的协调与控制
-
根据所面向对象的不同,可以将 JTA 的事务管理器和资源管理器理解为两个方面:
- 面向
开发人员
的使用接口(事务管理器) - 面向
服务提供商
的实现接口(资源管理器)。 - 其中开发接口的主要部分即为
UserTransaction
对象,开发人员通过此接口在信息系统中实现分布式事务;而实现接口则用来规范提供商(如数据库连接提供商)所提供的事务服务,它约定了事务的资源管理功能,使得 JTA 可以在异构事务资源之间执行协同沟通。以数据库为例,IBM 公司提供了实现分布式事务的数据库驱动程序,Oracle 也提供了实现分布式事务的数据库驱动程序, 在同时使用 DB2 和 Oracle 两种数据库连接时, JTA 即可以根据约定的接口协调者两种事务资源从而实现分布式事务。正是基于统一规范的不同实现使得 JTA 可以协调与控制不同数据库或者 JMS 厂商的事务资源
- 面向
-
JTA最重要的是三个接口:
-
UserTransaction
: 面向开发人员,开发人员通常使用该接口,实现应用程序对JTA全局事务的支持。 -
TransactionManager
: 事务管理器,将应用程序对分布式事务的使用映射
到实际的事务资源并在事务资源间进行协调与控制
,所以该事务管理器在使用的时候需要单例
。 -
Transaction
: 代表了一个物理意义
上的事务,实现真正的事务提交,回滚等操作,Transactiion.commit()
二阶段提交举例:public void commit() { // 得到当前事务中的所有事务资源 List<XAResource> list = getAllEnlistedResouces(); // 第一准备阶段:通知所有的事务资源管理器,准备提交事务 for(XAResource xa : list){ xa.prepare(); } //第二提交阶段:所有事务性资源,提交事务 for(XAResource xa : list){ xa.commit(); } }
-
各接口之间调用流程:
(1)在开发人员调用UserTransaction.begin()
方法时TransactionManager
会创建一个Transaction
事务对象(标志着事务的开始)并把此对象通过ThreadLocale
关联到当前线程。
(2)UserTransaction
接口中的commit()
、rollback()
等方法都将最终
通过TransactionManager
的得到与当前线程相关的Transaction
对象,委托给Transaction
类的对应方法
执行采用两阶段提交实现分布式事务.
UserTransaction.commit(){
Transation tx = (Transation)TransactionManager.get();
tx.commit();
}
事务资源是如何以透明的方式加入到 JTA 事务中的?
- 最最重要的一点是:在 JTA 事务 代码中获得的
数据库源 ( DataSource )
必须是支持分布式事务的; -
支持事务
的数据源与普通
的数据源是不同的,实现了额外的XADataSource
接口。 - 我们可以简单的将
XADataSource
理解为普通的数据源
(继承了java.sql.PooledConnection
),只是它为支持分布式事务而增加了 getXAResource 方法。另外,由 XADataSource 返回的数据库连接与普通连接也是不同的,此连接除了实现java.sql.Connection
定义的所有功能之外还实现了XAConnection
接口。我们可以把XAConnection
理解为普通的数据库连接,它支持所有 JDBC 规范的数据库操作,不同之处在于XAConnection
增加了对分布式事务的支持。通过下面的类图读者可以对这几个接口的关系有所了解:
JBoss
- 由第三方服务器JBoss等实现分布式事务管理
UserTransaction
和TransationManager
等。 - 在应用程序中使用
userTx = (UserTransaction)getContext().lookup("java:comp/UserTransaction");
方式获得 Transaction 管理对象,也成为JNDI的方式; - 我们目前基本不用。
Atomikos
- 我们目前比较主流的使用Atomikos公司旗下的事务管理器来管理分布式事务。
- 其中该公司旗下免费的:
TransactionEssentials
事务管理器为我们所用; - 点击查看另外一篇文章对Atomikos有详细的说明;