为什么要阅读本书 40年来,事务处理一直是一项重要的软件技术。运输业、金融业、零售业、电信业、制造业、政府部门和军事等各个领域的大型企业都完全依赖事务处理应用程序来完成电子预定服务、银行业务、证券交易、订单处理、音乐和视频服务、运货跟踪、政府服务、电话交换、库存控制以及指挥与控制等功能。很多大型的硬件和软件供应商,例如IBM、HP、Oracle、Microsoft、Dell、Red Hat和EMC,其收益的很大一部分来自于事务处理系统。事务处理产品和服务的销售额每年高达几百亿美元。作为消费者,我们每天都在使用这一技术来取款、购买燃气、租影碟及网上购物。 事务处理系统的工作原理具体是怎样的呢?这一问题曾经只有商用数据处理领域的计算机专业人员感兴趣。但是现在随着事务处理在经济领域的广泛使用,各个领域的工程师们都对此有兴趣。尽管如此,专业人员却难以找到可读性强的、技术内容充实的、介绍这一复杂技术的书籍。而本书填补了这一空白。 绝大多数大规模事务处理系统的软件环境都基于事务中间件,事务中间件有助于将很多软件组件联合起来。这些组件包括驱动Web浏览器和其他设备的前端应用程序,将请求路由到能够运行它们的服务器的中间层应用程序,以及执行事务逻辑的服务器应用程序。常见的事务中间件包括IBM的CICS、Microsoft的.NET Enterprise Services,以及Java Enterprise Edition产品,如IBM WebSphere Application Server、Oracle的WebLogic Server和Red Hat的JBoss Application Server。本书的前半部分着重介绍事务中间件技术。 对很多软件工程师而言,事务中间件在技术上比较晦涩难懂,此技术是他们不太熟悉的一种软件粘合剂,需要用到的技术似乎不只是操作系统、数据库系统、通信系统和应用程序设计语言。本书通俗地介绍了事务中间件,解释了事务中间件对事务处理系统的性能、安全性、可扩展性、可用性、可管理性和易使用性所起的作用。本书的前半部分详细地介绍了事务中间件,包括事务中间件为应用程序编程人员提供的特性,以及如何构造事务中间件来提供这些特性。 事务抽象本身在很大程度上是通过数据库系统实现的。数据库系统确保每个事务作为一个整体而执行,确保每个事务不受其他事务的干扰,确保每个事务生成的结果在硬件和软件发生故障的情况下能够保留下来。此行为是通过锁定、写日志、通信协议和复制等技术实现的。这些技术是本书后半部分的主题。 本书介绍事务处理,旨在满足广大读者的需要,包括以下读者。 ●有兴趣构建事务处理应用程序的应用程序编程人员。 ●管理用于事务处理的数据库系统的数据库管理员。 ●设计要部署在事务处理系统上的应用程序的应用程序分析员。 ●相关领域(例如,数据库系统、操作系统和通信领域)的产品开发人员。 ●负责系统和应用程序产品的市场营销和技术支持工程师。 ●要了解该主题的计算机学科的本科生和研究生。 我们关注的是事务处理的工作原理,而不是如何构建事务处理应用程序。我们通过很多产品的范例来演示说明如何应用这些原理以及这些想法是在什么情况下产生的,但不可能详细地叙述每一种产品。本书介绍实用的且在产品中使用到的技术,并适当介绍实践当中不常用的一些好想法。 阅读本书除需要熟悉系统外,不需要预先掌握特定的技术。希望读者熟悉SQL和数据库系统,但这不是必需的。 阅读完本书之后,您会理解事务中间件的工作原理和何时使用事务中间件,以及事务中间件和数据库系统如何协同工作以支持可靠的分布式事务处理应用程序。还会迅速掌握如何使用任何事务中间件产品或数据库系统来支持事务处理应用程序的开发和管理。 第2版的新增内容 简单来说,第2版的新增内容很多。其中有几章是新增加的,有几章是重新编写的,其余各章也有很多内容是新增的或修订过的。 做这些改动的主要目的有两个。一是介绍自从12年以前第1版出版以来新出现的和修订的事务体系结构和技术。那时,基于Internet的电子商务刚刚兴起。而现在,它已经成为很多B2C(企业-对-消费者)和B2B(企业-对-企业)市场的主要部分。这部分市场的成长以及服务器硬件和操作系统的商品化使事务处理产品发生了根本变化。Web浏览器技术目前在与事务处理系统交互的各种技术中占据着主导地位。事务中间件已由联机事务处理监视器发展出很多新产品类别,它们可以很好地用于Internet上,如应用服务器、对象请求代理、面向消息的中间件和工作流系统。面向对象编程和面向服务体系结构已成为主流。数据库系统已成为更完善的事务处理环境。这些变化在此第2版中都会反映出来。 第二个主要目的是增加传统事务处理主题的广度和深度,使本书更加完善。在某种程度上,这基于第一作者将本书用作华盛顿大学研究生的计算机科学课程的教材所获得的经验。另外,第2版的也反映了技术的进步,这些以前新奇的技术现在已得到了广泛的应用。 具体来说,第2版的主要变化如下:关于事务中间件的3章完全是重写的,其中有两章是关于事务中间件原理的,有一章篇幅很长,介绍了示例产品和标准,包括Java Enterprise Edition和Microsost .NET的细节。有一章新内容是关于业务流程管理的。而关于锁定机制的一章则新增了内容,包括乐观并发控制、B树锁定、多粒度锁定和嵌套事务。同时还新增了TPC-E准则、状态管理、可伸缩性、影式分页、数据共享系统、一致性算法、基于日志的复制以及多主复制等内容。面向服务的体系结构(SOA)、REST和Web服务的概念贯穿全书。另外,在很多地方还对技术细节进行了小小的补充。每一章都有大的改动。 出版商在关于本书的网页上将提供补充材料。最开始,将只包括按章组织的问题选择,以后会逐渐增加其他的技术材料。 本书主要内容 购买了事务处理系统的企业希望系统提供快速服务,购买价格和操作都不太昂贵,而且希望随着使用的增加和新应用程序的不断增加,系统是可伸缩的。应用程序编程人员希望不受运行事务处理系统所要求的众多复杂的不同类型技术(如事务协议、消息协议、事务远程过程调用、持久性队列、多线程进程、资源池、会话管理和复制协议)的影响。应用程序编程人员的工作是理解企业想要事务做什么并编写程序完成它。系统软件应使应用程序能够在快速、高效、可伸缩和可靠的系统上运行。这就是本书前半部分(1~5章)主要介绍的事务中间件要完成的任务。第10章介绍当今的事务中间件产品和标准。 事务处理系统的用户想把系统看作事务的顺序处理器,认为它是一个无比可靠的处理器,一心一意执行他们的事务,执行整个事务(而不只是事务的一部分),并永久保存事务的结果。这有些苛求,并且根本没有描述系统内部真正发生的事情:系统并发地执行很多事务;系统时不时会由于软件和硬件错误而发生故障,且常常可能发生在最坏的时候(运行事务时);系统只有有限的存储能力。但是,通过组合使用各种软件技术,系统的运转情况大体符合用户的期望。这些技术是第6~9章的主题。 随着计算技术的发展,事务处理技术也随之发展,以支持计算技术。第11章讨论一些主要趋势:云计算,可扩展的分布式计算,闪存,以及流和事件处理。 下面是各章概要。 ●第1章“介绍”简单概述了事务处理应用程序和系统结构。本章描述了面向服务的计算,事务的ACID特性,两阶段提交协议,业界标准的TPC性能准则,高可用性要求,以及事务处理与批处理系统、实时系统和数据仓库系统的关系。 ●第2章“事务处理抽象”描述了事务处理系统中使用的主要软件抽象:事务,进程和线程,远程过程调用,用来管理共享状态(如事务上下文、会话和cookie)的技术,以及可伸缩性技术(如高速缓存、资源池、分区和复制)。 ●第3章“事务处理应用程序体系结构”阐述了多层应用程序体系结构的作用,并详细深入地讨论了每一层:使用表单和Web服务器与最终用户设备通信的前端,包含事务加括号的请求控制器,以及执行事务的事务服务器。本章还介绍了事务中间件和数据库服务器是如何组织这些活动的。 ●第4章“队列事务处理”介绍了持久消息队列如何增加可靠性。本章提供了恢复场景的详细走查,展示了队列如何驱动发布-订阅以及基于代理和基于总线的面向消息的中间件。本章还以IBM的Websphere MQ和Oracle的Stream AQ为例阐述了队列管理器的内部特性。 ●第5章“业务流程管理”描述了作为多个相关事务执行的业务流程的创建、管理和监控的支持机制。解释了如何获得多事务请求的原子性、隔离性和持久性。概述了业务流程执行语言(BPEL)标准,并以Microsoft SQL服务代理(Service Broker)为例概述了业务流程机制。 ●第6章“锁定”展示了两阶段锁定的工作方式和原因,以及应用程序编程人员如何影响其正确性和性能。描述了锁管理器的实现和死锁处理。然后详细解释如何能够通过锁粒度、乐观方法、批处理、避免热点、避免幻象以及使用较低隔离度和多版本方法支持查询-更新工作负载等来控制性能。最后,本章介绍了B-树锁定和SQL数据库系统使用的多粒度锁定以及嵌套事务的锁定。 ●第7章“系统恢复”识别故障发生的原因以及事务如何帮助屏蔽所造成的影响。讨论基于检查点的应用程序恢复,使用无状态服务器简化恢复,以及使用进程对来减少恢复时间的暖备份和热备份系统。然后介绍数据库系统如何使用日志来恢复事务故障、系统故障和介质故障。介绍撤消和重做范式、日志算法的工作原理和原因、日志检查点、恢复算法、影式分页、一些流行的记录日志优化(包括ARIES算法)及归档恢复。 ●第8章“两阶段提交”详细介绍两阶段提交协议。详细介绍恢复的,展示用户必须参与的地方以及为什么必须参与。介绍流行的优化技术,如推定中止、阶段零和协调转换。解释数据库系统和事务管理器如何使用X/Open事务管理体系结构的XA接口进行互操作。 ●第9章“复制”描述复制服务器与复制资源之间的平衡,并展示如何将正确性标准-- 即单副本可串行性-- 分别运用于复制服务器与复制资源。介绍两种最流行的复制方法:主副本复制和多主复制。在主副本复制中,对主副本的更新只传播到从副本;在多主复制中,更新被运用于所有副本,然后传播到其他副本。还介绍了连接到共享数据库的复制高速缓存的同步,以及用于选出主复制、法定一致、建立最新状态和复制恢复等的算法。 ●第10章“事务中间件产品和标准”描述事务中间件流行的产品和标准,如Java企业版(Java Enterprise Edition)、Microsoft的.NET企业服务(.NET Enterprise Services)、遗留的事务处理监视器(CICS、IMS、Tuxedo、ACMS和Pathway)和其他面向服务的中间件。组件技术包括Windows通信基础(Windows Communication Foundation)、企业JavaBean、Java数据库连接器、Java事务API和Spring框架,它们出现在IBM、Oracle和Progress的产品中以及其他开放源码软件中。还介绍了OMG和X/Open的事务标准和OASIS的Web服务标准。 ●第11章“未来的发展趋势”介绍事务处理技术发展的主要方向:云计算平台,使用分布式计算组件组成可伸缩系统,用闪存取代磁盘,来自作为事务请求源的传感器设备的数据和事件流。 教师指导 在过去的25年中,本书的第一作者已经讲授了数十次事务处理课程。他最新提供的材料可在华盛顿大学计算机科学与工程系的网站上找到,其网址是,其中有作业、项目和演讲视频。 最适用于大学正规课程的教学大纲是在课程的前半部分讲授,即本书第1章涉及的内容以及后面的并发控制原理(6.1~6.4节)和恢复(第7章)。这些内容促使学生深入研究技术细节,通过组织起来的家庭作业,可以很好地领会这些技术细节,也可以应付常规考试。这使学生能够运用课程项目。 事务处理是一个系统工程问题,有很多交互部分。我们尝试了3种不同的课程项目,帮助学生理解各部分如何组成一个整体:应用程序的案例研究;使用商业产品(如Microsoft .NET或Java Enterprise Edition)构建应用程序;为运行分布式事务构建事务中间件系统。无论从学生还是从老师的角度来看,最后一个项目都是最有效的。因此,在最新的材料中,要求所有学生都完成此项目。 此项目构建一个旅游预订系统框架,包括航班、宾馆房间和汽车租赁。这就需要使用锁定和恢复、两阶段提交协议以及事务中间件来构建一个资源管理器,以满足上述需求。即使是全职专业编程的研究生,在只有10周的一个学季中完成上述工作,工作量也是相当大的。因此,我们提供了一些组件,学生可以从这些组件开始。软件可以从课程的网站下载。 致谢 本书开始于20多年前第一作者的讲义。这些年来,DEC公司、Wang Institue of Graduate Studies(虽然已不存在,但不能忘记)、Microsoft公司和华盛顿大学的一千多人已学过本课程。大多数学生都是具有实践经验的工程师,他们提出了数不清的想法,这些想法已经成为本书的一部分。感谢他们提供了丰富的细节。 很多人慷慨地花时间审阅选中的章节,纠正其中的错误,指出书中的漏洞,并经常填补这些漏洞。非常感谢Brian Milnes,他详细审阅了整本书,并根据他运行大型互联网TP系统的经验补充了很多内容。衷心感谢John Apps、Darach Ennis、Mike Keith、David Kubelka、Mark Little、Peter Niblett、Betty O Neil、Pat O Neil、Gera Shegalov、Tony Storey、Satish Thatte和Roger Wolt,尤其是开发多主复制新部分的合作伙伴Lev Novik,感谢他们在各个章节给我们提供的帮助。 要在书中包含产品、应用程序和准则的很多范例并弄清楚它们是一个很大的挑战。如果没有致力于相关产品的工程师的大力帮助,我们绝不可能战胜这一挑战。他们审阅了若干遍,并帮助我们仔细考虑每一个细节。对于任何由于疏忽而产生的错误,虽然我们承担全部责任,但也很乐意分享与Keith Evans、Max Feingold、Tom Freund、Jonathan Halliday、Jeurgen Hoeller、Rajkumar Irudayaraj、Jim Johnson、Ed Lassettre、Charles Levine、Anne Thomas Manes、Miko Matsumura、Laurence Melloul、Dean Meltz、Geoff Nichols、Greg Pavlik、Mike Pizzo、Ian Robinson、Adrian Trenaman、Steve Vinoski、John Wells、Jesse Yurkovich的相互信任。 在第1版的编写过程中,我们得到了Jim Gray和Joe Twomey的大力帮助,获益匪浅。同时也感谢Mario Bocca、Dexter Bradshaw、Ian Carrie、Ed Cobb、Gagan Chopra、Dick Dievendorff、Keith Evans、Wayne Duquaine、Terry Dwyer、Ko Fujimura、Per Gyllstrom、Vassos Hadzilacos、Brad Hammond、Pat Helland、Greg Hope、Larry Jacobs、Roger King、Walt Kohler、Barbara Klein、Dave Lomet、Susan Malaika、Michael C. Morrison、Tamer Ozsu、Wes Saeger、David Schorow、Randy Smerik、Alex Thomasian、Karen Watterson和Tom Wimberg提供的帮助。