【IT168 专稿】
开场白:既然是漫谈,肯定是泛泛而谈。求多而不求精是目标,达到抛砖引玉、引发思考或者讨论乃最终目的。
当前,企业应用变得越来越复杂,常常需要多个业务系统一同协作才能完成一个端到端的业务。因此如何协调多个业务系统来保证业务的事务性成为一个很关键问题。
WebSphere应用服务器(WAS)作为一个先进的J2EE平台,其本身也是一个事务管理器。它实现了JTA(Java Transaction API)和JTS(Java Transaction Service),对分布式事务提供了强大的支持。同时WAS还提供了有价值的编程模型扩展来最大限度的保证多个资源之间的事物一致性。
当然了,既然定位是漫谈,肯定是泛泛而谈。求多而不求精是目标,达到抛砖引玉、引发思考或者讨论乃最终目的。所以本文会从事务的历史开始谈起,然后到X/Open的DTP模型,CORBA的OTS一直到J2EE的JTS;最后,既然该文要和WebSphere应用服务器扯上关系,当然得写上几笔WebSphere相关的东东。因为都是WebSphere特定的内容,如果对此不关心完全可以视而不见......
1.事务及事务管理器的基本概念和历史
说起事务,大部分人都马上能说出事务的四个属性:ACID(原子性、一致性、隔离性和持久性)。
事务这个概念最先来自数据库领域。我们可以看一下wikipedia上如何定义数据库事务的:
A database transaction comprises a unit of work performed within a database management system (or similar system) against a database, and treated in a coherent and reliable way independent of other transactions.
从该定义其实已经可以体现出事务的四个特性了。而提供事务能力的事务处理系统早在60年代就出现了,典型代表有到现在还在企业中稳定运行的IBM的CICS、BEA的Texedo等。而后事务处理最为一个新兴的学科开始发展起来,并在伟大的图灵奖得主、一个传奇式的人物 - Jim Gray下得到发扬光大。他的事务处理-概念和技术这本著作也成为这个领域的不朽经典。
除此之外,影响深远的当属X/Open提出的DTP模型了。
在90年代,随着分布式计算的兴起,企业的计算模式也发生了质的变化。一个业务的生命周期往往需要跨越多个系统和多种资源(如数据库,消息系统等)。因此如何保证这种分布式计算模式下面的事务性成了当时研究的热点。其中X/Open的DTP模型规范了事务处理系统中各组件的职能及交互的契约,它也成为目前这个领域的事实标准。
如上图所示,该模型提供了一个构建分布式事务处理系统的方法。其核心包括三个组件和两组接口。
三个组件:
(1) 应用程序(AP):应用程序是事务的发起者;它决定了一个事务的生命周期(比如什么时候开始一个新的事务、什么时候该提交或者回滚事务)。
(2) 事务管理器(TM):如其名字所表述的,它提供了对事务的管理和恢复。
(3) 资源管理器(RM)(Resource Manager),负责对资源的访问。
两组接口:
(1) TX接口。该接口定义了应用程序和事务管理器之间交互的方法。比如应用程序可以调用事务管理器的tx_open/tx_close方法用来建立/断开事务管理器。然后使用tx_begin/tx_rollback/tx_commit来通知事务管理器开始/ 回滚/提交事务。
当事务管理器接收到开始/回滚/提交事务的请求后,事务管理器必须告知加入到当前事务的资源管理器来执行对应的操作,这是通过另一组XA接口来实现的。
(2) XA接口定义了事务管理器和资源管理器之间交互的方法。重要的的方法有:
xa_open/xa_close。事务管理器通过调用这两个方法来通知资源管理器进行初始化和结束。
xa_start/xa_end。事务管理器通过这两个方法来通知资源管理器开始和结束事务。这两个方法也就确定了一个事务的边界。
xa_prepare/xa_commit/xa_rollback。事务管理器通过两阶段提交协议来通知资源管理器进行事务的提交或者回滚。
在这个模型下,一个典型的事务处理可以表示如下:
//1. 应用程序开始事务。
tx_begin.
//应用程序进行业务操作,在需要保证事务的部分开始事务。
tx_begin
//应用程序调用资源管理器进行业务操作
//事务管理器通知资源管理器进行初始化
xa_open
//事务管理器通知资源管理器事务开始
xa_start
//资源管理器记录事务性操作。。。
//最后应用提交事务。
tx_commit
//事务管理器通知资源管理器开始两阶段提交,最后结束事务
xa_prepare
xa_commit
xa_close
tx_close
CORBA的兴起也给X/Open的DTP模型找到了一个绝好的实践场地。
在OMG的OTS规范中给出了如下的事务架构:
可以看到该模型其实和DTP模型是完全一致的,只不过是用CORBA来重新描述了而已。而且在OTS中也明确说明了是可以和X/Open的DTP互操作的。