本文共分两部分:第一部分从事务服务整体描述的角度简要介绍了事务服务产生的动机、事务服务的应用和事务服务的功能,其中以具体的例子解释了相关概念和事务服务涉及到的一些术语;第二部分以J2EE中的事务服务为例对事务的实现作简要的介绍。
第I部分 事务服务简述 事务是一个非常重要的编程概念,使用事务,可以很简单地构造出可靠稳定的应用程序,尤其对那些需要进行并发数据访问的应用程序,事务更是重要的多。事务的概念最初应用在那些用于商务操作的应用程序上,在这些应用中,事务用来保护中央数据库中的数据。随后,随着分布式计算的发展,事务在分布式计算领域中也得到了广泛的应用。现在,在分布式计算领域中,公认为事务是构造可靠性分布式应用程序的关键。 1.1事务产生的动机 1.1.1原子操作 考虑这样一个应用:用户把钱从一个银行账号转账至另一个银行账号,需要将资金从一个银行账号中取出,然后再存入另一个银行账号中。理想来说,这两次操作都应该成功。但是,如果有错误发生,则两次操作都应该失败,否则的话,操作之后其中一个账号中的金额将会是错误的,整个操作过程应该是原子性的,两个操作都是一个原子事务操作的一部分。 可以使用异常处理来处理上述问题,代码如下:
上面这种解决方法从存在着下面的问题:
因此,需要一种事务处理机制来保证这种原子性的操作。 1.1.2 网络故障或机器故障 为了在发生严重故障之后,能够保证系统的状态是一致的,所以需要一种恢复性的机制来保证这一点。 1.1.3 数据共享 需要一种机制来保证多用户并发访问数据的问题。 以上这些问题的解决方法,便是使用事务服务。 1.2 使用事务服务带来的好处 使用事务,便可以利用事务的四个重要属性:ACID。
事务服务支持的应用由下列实体组成:
下图展示了一个简单的事务应用,包含了基本的事务元素:
事务服务提供下列操作:
3.1事务模型
3.2 事务的终止 通过发出提交请求或回滚请求来终止事务。通常,事务是由发起事务的客户(事务发起者)来终止的。 3.3事务的完整性 某些事务服务的实现为了保证事务的完整性,在事务服务接口的使用上施加了一些限制。这称为checked事务行为。例如,在事务的所有任务完成之前提交事务会导致数据不完整。事务服务的Checked实现会阻止事务的过早提交。其他事务服务的实现则完全依赖应用程序来提供事务的完整性保证,这称为unchecked事务行为。 3.4事务的上下文 事务上下文惟一标识了一个事务,保存了事务的当前状态。通过查询事务上下文,可以得知自身是否处于事务中,所在事务的状态以及其他一些有用的信息。 事务上下文可以作为事务操作调用的一部分隐式地传递给事务对象。事务服务也允许程序员将事务上下文作为事务请求的显示参数来传递。 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。为了实现分布式事务,需要使用下面将介绍的两阶段提交协议。
在分布式事务两阶段提交协议中,有一个主事务管理器负责充当分布式事务协调器的角色。事务协调器负责整个事务并使之与网络中的其他事务管理器协同工作。 为了实现分布式事务,必须使用一种协议在分布式事务的各个参与者之间传递事务上下文信息,IIOP便是这种协议。这就要求不同开发商开发的事务参与者必须支持一种标准协议,才能实现分布式的事务。 以上从事务整体描述的角度简要介绍了事务服务产生的动机、事务服务的应用和事务服务的功能,下面以J2EE中的事务服务为例对事务的实现作简要的介绍。 |
第II部分 J2EE中的事务服务 Java TM2 Platform, Enterprise Edition(J2EE)简化了分布式事务管理应用程序的编写。J2EE包括了两套规范,用来支持分布式的事务,一种是Java Transaction API(JTA),另一种是Java Transaction Service(JTS)。JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object Transaction Service(OTS) 1.1规范的Java映射。JTS使用Internet Inter-ORB Protocol(IIOP)来传播事务。作为J2EE平台实现的一部分,SUN实现了一个支持JTS的事务管理器,同时还实现了JTA。 JTA和JTS让J2EE应用服务器完成事务管理,这样就使得组件开发人员摆脱了事务管理的负担。开发者只需在部署描述符中声明事务管理属性,便可以使得EJB组件参与到事务之中,由应用服务器来负责事务的管理。
企业级Java中间件的分布式事务服务包括五层:事务管理器(Transaction Manager)、应用服务器(Application Server)、资源管理器(Resource Manager)、应用程序(Application Program)和通信资源管理器(Communication Resource Manager)。每一层都通过实现一组事务API和相关机制参与到分布式事务处理系统中。
从事务管理器的角度出发,事务服务的具体实现是不需要暴露出来的,只需要定义高层接口,使得事务服务的用户可以驱动事务界限、资源获取、事务同步和事务恢复过程。JTA的目的是定义事务管理器所要求的本地Java接口,从而在企业级分布计算环境中支持事务管理。下图中的小半圆代表JTA规范。 本节从事务管理器实现者的角度描述了实现方面的要求。如下图,事务管理器必须实现JTA接口,用于支持应用服务器和资源管理器。不要求实现对JDBC 1.0 Driver和非JTA资源管理器支持。也不要求实现对各种CORBA应用实体的支持,如事务客户端(Transactional Client)、事务服务器(Transactional Server)和恢复服务器(Recoverable Server)。 Java Transaction API由三部分组成:高层的应用事务划分接口(供事务客户使用)、高层的事务管理器接口(供应用服务器使用)和X/Open XA协议的标准Java映射(供事务性资源管理器使用)。 4.1 UserTransaction接口 Javax.transaction.UserTransaction接口使得应用程序能够编程控制事务边界。这个接口可以由Java客户端程序或者EJB来使用。 4.1.1在EJB Server中的UserTransaction支持 EJB中对事务的管理有两种类型:
4.1.2 事务客户端中的UserTransaction支持 Java客户端程序需要首先通过JNDI来获得UserTransaction对象的引用,然后使用该对象的方法完成事务的开始、提交或者回滚。
4.2 TransactionManager接口 应用服务器使用javax.transaction.TransactionManager接口来代表受控的应用程序控制事务的边界。例如,EJB容器为事务性EJB组件管理事务状态。 4.3 Transaction接口 使用Transaction接口可以执行与目标对象相关联的事务操作。 4.4 XAResource接口 Javax.transaction.xa.XAResource接口是基于X/Open CAE规范(分布式事务处理:XA规范)工业标准XA接口的Java映射。 XAResource接口定义了分布式事务处理环境(DTP)中资源管理器和事务管理器之间是如何交互的。资源管理器的资源适配器实现了XAResource接口,将事务同事务资源联系起来,类似关系数据库的一个连接。 4.5 Xid接口 Javax.transaction.xa.Xid接口是X/Open事务标识符XID结构的Java映射。这个接口由事务管理器和资源管理器来使用,对于应用程序和应用服务器而言这个接口是不可见的。 |