引言
JTA(Java Transaction API)答应应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。
本文的目的是要提供一个关于的Java事务处理API(JTA)的高级的概述,以及与分布式事务相关的内容。一个事务处理定义了一个工作逻辑单元,要么彻底成功要么不产生任何结果。 一个分布式事务处理只是一个在两个或更多网络资源上访问和更新数据的事务处理,因此它在那些资源之间必然是等价的。在本文中,我们主要关心的是如何处理关系数据库系统。
我们要讨论的分布式事务处理(DTP)模型中包含的组件是:
应用程序
应用程序服务器
事务治理程序
资源适配器
资源治理程序
访问数据库
最好把分布式事务处理中包含的组件看作是独立的过程,而不是考虑它们在一个特定的电脑中的位置。这些组件中的一些可以保存在单机中,或者也可在好几台机器之间分布。 下面例子中的图表可以显示在一台特定的电脑上的组件,但是这些操作之间的关系是必须首要考虑的。
最简单的例子:用于本地数据库事务处理的应用程序
关系数据库访问的最简单的形式仅仅包括应用程序、资源治理程序和资源适配器。应用程序只不过是发送请求到数据库并且从数据库中获取数据的最终用户访问点
我们讨论的资源治理程序是一个关系数据库治理系统(RDBMS),比如Oracle或者SQL Server。所有的实际数据库治理都是由这个组件处理的。
资源适配器是外部空间之间的通信管道组件,或者是请求翻译器,在本例中,是应用程序和资源治理程序。在我们的讨论中,这是一个JDBC驱动程序。
下面的描述是资源治理程序本地事务处理的一个描述,也就是说,一个事务处理被被限制在一个特定的企业数据库。
应用程序发送一个用于JDBC驱动程序数据的请求,然后翻译这个请求并把它通过网络发送到数据库中。 数据库把数据发送回驱动程序,然后把翻译的结果发送回应用程序。这个例子说明了在一个简化的系统中的基本的信息流;然而,今天的企业使用的应用程序服务器都添加了其他的组件到这个过程处理中。
应用程序服务器
应用程序服务器是事务处理操作的另一个组件。应用程序服务器处理大部分的应用程序操作并且获得最终用户应用程序的一些负载。基于前面的例子,我们可以看出应用程序服务器在事务处理上添加了另一个操作层:
到目前为止,我们的例子说明了单个的本地事务处理,并且描述了分布式事务处理模型的五个组件中的四个。第五个组件,事务治理程序只有当事务将要被分配的时候才会开始被考虑。
分布式事务处理和事务治理程序
像我们前面所提到的,一个分布式事务处理是一个在两个或更多网络资源上访问和更新数据的事务处理。
这些资源可以由好几个位于一个单独服务器上的不同的关系型数据库治理系统组成,比如说Oracle、SQL Server和Sybase;它们也可以包含存在于若干不同的服务器上的同一种数据库的若干个实例。在任何情况下,一个分布式事务处理包括各种的资源治理程序之间的协同作用。这个协同作用是事务治理函数。
事务治理程序负责作出要么提交(commit)要么退回(rollback)任何分布式事务处理的决定。一个提交决定应该导致一个成功的事务处理;而退回操作则是保持数据库中的数据不变。 JTA指定一个分布式事务处理中的事务治理程序和另一个组件之间的标准Java接口:应用程序,应用程序服务器和资源治理程序。
在事务治理程序四周的数字框框相应于JTA的三个接口部分:
1.UserTransaction?javax.transaction.UserTransaction接口提供能够编程地控制事务处理范围的应用程序。 javax.transaction.UserTransaction方法开启一个全局事务并且使用调用线程与事务处理关联。
2.Transaction Manager?javax.transaction.TransactionManager接口答应应用程序服务器来控制代表正在治理的应用程序的事务范围。
3.XAResource?javax.transaction.xa.XAResource接口是一个基于X/Open CAE Specification的行业标准XA接口的Java映射。
注重,一个限制性环节是通过JDBC驱动程序的XAResource接口的支持。JDBC驱动程序必须支持两个正常的JDBC交互作用:应用程序和/或应用程序服务器,而且以及JTA的XAResource部分。
编写应用程序水平代码的开发者不会关心分布式事务处理治理的细节。 这是分布式事务处理基本结构的工作?应用程序服务器、事务治理程序和JDBC驱动程序。应用程序代码中唯一的需要注重的就是当连接处于一个分布式事务范围内的时候,不应该调用一个会影响事务边界的方法。非凡的是,一个应用程序不应该调用Connection方法commit、rollback和setAutoCommit(true),因为它们将破坏分布式事务的基本结构治理。
分布式事务处理
事务治理程序是分布式事务基本结构的基本组件;然而JDBC驱动程序和应用程序服务器组件应该具备下面的特征:
驱动程序应该实现JDBC 2.0应用程序接口,包括Optional Package接口XADataSource和XAConnection以及JTA接口XAResource。
应用程序服务器应该提供一个DataSource类,用来实现与分布式事务基本结的交互以及一个连接池模块(用于改善性能)。
分布式事务处理的第一步就是应用程序要发送一个事务请求到事务治理程序。虽然最后的commit/rollback决定把事务作为一个简单的逻辑单元来对待,但是仍然可能会包括许多事务分支。一个事务分支与一个到包含在分布式事务中的每个资源治理程序相关联。因此,到三个不同的关系数据库治理的请求需要三个事务分支。每个事务分支必须由本地资源治理程序提交或者返回。事务治理程序控制事务的边界,并且负责最后决定应该提交或者返回的全部事务。 这个决定由两个步骤组成,称为Two - Phase Commit Protocol。
在第一步骤中,事务治理程序轮询所有包含在分布式事务中的资源治理程序(关系数据库治理)来看看哪个可以预备提交。假如一个资源治理程序不能提交,它将不响应,并且把事务的特定部分返回,以便数据不被修改。
在第二步骤中,事务治理程序判定否定响应的资源治理程序中是否有能够返回整个事务的。假如没有否定响应的话,翻译治理程序提交整个事务并且返回结果到应用程序中。
开发事项治理程序代码的开发者必须与所有三个JTA接口有关:UserTransaction、TransactionManager和XAResource,这三个接口都被描述在Sun JTA specification中。JDBC驱动程序开发者只需要关心XAResource接口。这个接口是答应一个资源治理程序参与事务的行业标准X/Open XA协议的Java映射。连接XAResource接口的驱动程序组件负责在事务治理程序和资源治理程序之间担任"翻译"的任务。下面提供了XAResource调用的例子。