事务处理:概念与技术
作者 : (美)Jim Gray, Andreas Reute
译者 : 孟小峰 于戈 等
丛书名 : 计算机科学丛书
出版日期 : 2004-01-08
ISBN : 7-111-12641-6
定价 : 96.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 860
开本 : 16开
原书名 : Transaction Processing: Concepts and Techniques
原出版社: Morgan Kaufmann Publishers, Inc.
属性分类: 教材
包含CD :
绝版 :
图书简介

事务处理广泛地应用于数据库和操作系统领域,并在现代计算机系统中监控、控制和更新信息。本书向读者展示了大型的、分布的、异构的计算机系统是如何进行可靠工作的。作者使用事务作为基本概念,说明了在有限的资金和风险下如何构建高性能的高可用性应用。书中还详细阐述了各种可能发生的问题,以及解决这些问题的实际可用的技术。
  本书列举了大量成功的商业和研究系统的实例,此外,列出了许多事务处理算法的可编译的C代码片段。本书对于那些对实现分布式系统或客户-服务器结构感兴趣的人来说,是值得一读的.
  没有事务,分布式系统就不能满足典型应用的需要——这是许多系统实现人员和应用开发人员从实践中得到的经验。本书主要阐述事务概念是如何用于解决分布式系统问题的,以及这些概念如何使我们能够在有限的资金和风险范围内建立高性能、高可用性的应用系统。本书内容广泛,从系统的角度全面阐述事务处理的概念和技术,涉及终端上的表示管理、通信子系统、操作系统。数据库、程序设计语言的运行时系统以及应用开发环境等。

图书特色

图书前言

买书的同时若能买到读书的时间,将是再好不过了。
                   亚瑟·叔本华:附录和补遗

写作此书的目的
  本书的目的就是帮助读者理解大型、分布、异构的计算机系统可靠工作的原理。与常见的分布计算的复杂方法不同,本书力图展示一种易于使用的分布系统应用开发方法。为什么书名不用诸如分布系统、高可靠性、互操作性或客户/服务器等词汇,而使用了一个比较一般的术语—事务处理呢?对很多人来说这是一个表示老式数据处理的词汇,指面向批处理和大型主机的工作方式。
  问题的关键是,一个大型的应用系统可能具有上千个终端,用到上百台计算机,需提供绝对没有停机时间的服务,对这种系统的设计、实现和操作,只从一个角度来阐述清楚是不可能的,这也是本书如此浩繁的原因。因此需要用一种综合的观察角度和方法来解决分布系统的问题。我们的宗旨是说明,事务提供了这样一种集成的概念框架,而面向分布事务的操作系统可以作为具体的实现技术。客户/服务器范型提供了一种结构化系统和开发应用的好方式,但仍然需要用事务来控制客户/服务器的交互操作。简而言之:没有事务,分布式系统不能满足典型实际应用的需要。
  不过这并不是最关键的理由;更重要的是,这是许多人(包括系统实现者、系统管理者和应用开发人员)从实践中得到的收获。当然,开发大型系统的概念已经由来已久。事实上,在批处理处于全盛的时期,一些主要思想老早就被人们提出了,而且至今它们也不显得过时。事务处理概念是为解决单处理器联机应用的复杂性而被提出的。其实,这些概念对具有更高复杂性的海量分布系统的有效实现,显得更为至关重要。本书主要阐述事务概念是如何用于解决分布系统问题的,以及这些概念如何使我们在有限的资金和风险范围内,能够建立高性能、高可用性的应用。我们试图通过一些我们所熟悉的“历史教训”来阐述这一开发理念。归结一点,事务有助于掩盖,甚至避免分布系统的复杂性。
目前有很多的书是关于数据库系统(传统的数据库和分布数据库)、操作系统、计算机通信、应用开发的—还可以列很多。围绕这些术语的学科划分已深深地根植于世界各地的计算机科学的教学体系中。相应的教育和专家也按此分门别类。有关的书籍通常是以一种枚举的风格,将过去十多年在这一领域的技术文献中的主要思想罗列给读者。这种写作风格试图提供很多观点和可供选择的方案,但很少告诉读者什么观点是好的,什么是不怎么好的,以及为什么好与不好。更确切地说,你若要真的设计和实现一个实际系统,这些有关算法的一般综述几乎不能说明什么,例如,如何开始以及从哪里开始你的系统设计。
  我们的宗旨是帮助读者解决实际问题。本书的重点在于,对问题只提供一两个解决方法和有关的说明,而对许多其他的方法并不一一涉及,也就是说本书不采用百科全书式的叙述风格。但本书的内容是广泛的,它将从一个系统的角度全面阐述事务处理的概念和技术。要使一个大型的系统正常运行,必须采用一种真正的“一条龙”的观点,即从一个请求开始,通过系统的各个层次和构件,直到结果被安全地输出为止。这其中要涉及终端上的表示管理、通信子系统、操作系统、数据库、程序设计语言的执行系统以及应用开发环境等。设计一个集成度如此之高的系统,所需要的一套设计方案将完全有别于功能有限的算法设计。这种全面整体性的方法是在其他有关分布系统和数据库的著作中所未曾见到的。自1986年我们开始写作本书以来,我们一直深信这种方法是必需的。

内容的选择和组织
  由于采用“一条龙”的观点,这需要我们覆盖很多基础性的东西,我们将重点放在事务处理的基本概念上:如简单的TP系统的结构化问题、简单的事务模型、简单的加锁、简单的写日志、简单的恢复等等。随便翻翻目前的教材和参考书,就会发现它们在基本概念上是模糊不清的。例如,在现有的教材中,我们还没有发现有关B树的真正实现的描述。而B树目前是用于数据库、文件系统、信息检索系统等之中的基本存取路径结构,是真正基本的东西。本书更像一本编译课程的教材或Tanenbaum的操作系统书。其中提供了很多代码片段用于说明基本算法和数据结构。
  本书注重实效,详尽阐述并覆盖基本的事务处理问题。本书的写作使我们确信这是一种好的方法,不过这种写作方法和风格可能看起来比较陌生。我们的动机就是要以注重实效的观点阐述问题。目前没有结构化复杂系统的理论;因此重大决策不是依赖理论,更合适的做法是依赖良好的基础修养和依从好的工程原则—即注重实效的标准。我们相信,这些从面向事务处理的基本概念中导出的原则,会在未来若干年内显得至关重要。
  本书主体部分有7个主题,共分16章,阅读上可或多或少地相互独立,并可按不同的次序阅读。
  第一个内容是事务处理的总体概述(第1章)。它讲述了总体的系统概貌。介绍了基本的事务特性:原子性(要么全做,要么全不做)、一致性(状态的正确转换)、隔离性(没有并发冲突)、永久性(已提交的更新不受任何系统故障的影响)—简称为ACID。没有技术背景的读者阅读到此,就能够对本领域有大致的了解。
  第2章是为那些对计算机科学基本术语不甚熟悉的读者准备的。本章介绍了有关硬件、软件、协议标准等等方面最为重要的术语和概念。所有这些术语是后续讨论所必需的。
  第3章阐述为什么系统会失败,并给出如何避免此类故障的建议。本章回顾了硬件和软件的容错概念和技术(如彻底失败、冗余、模块化、修复)。若你想使用不完善的现成组件开发一个具有1万年平均无故障时间的模块,本章可以提供这方面的内容。第3章解释了在构建高可用软件时事务的重要意义。
  第4~6章讲述了事务的有关理论和使用。第4章详细讨论了把应用系统构造为事务的具体含义。重点讨论了目前不能被扁平事务很好支持的计算类型。进行这些计算的应用需要事务概念的扩展和广义性。第5章通过描述TP监控器的作用,解释了面向事务的计算究竟对操作系统和其他低级别部件意味着什么。同时还解释了事务程序如何与这些系统服务交互作用。第6章是面向程序设计人员的。它提供了很多程序控制结构和代码片段来解释事务型的远程过程调用的工作原理、请求调度的处理,以及其他精妙之处。对位级(bit-level)事件不感兴趣的读者可略过本章的前半部分,直接从6.4节事务队列的内容开始阅读。
  第7、8章介绍了并发的理论和实践。事务处理系统将应用中的所有并行执行部分掩盖起来,因此支持了ACID特性中的隔离性。第7章叙述了这些技术背后的理论,第8章则展示了如何用封锁技术实现这一理论。
  第9~12章介绍了事务管理和恢复技术,即与事务原子性和永久性有关的内容。第9章讲述写日志和归档的处理。第10章讨论如何编写事务型资源管理器,如数据库系统或队列管理器。它阐述了资源管理器如何与事务相结合,如何写日志记录、获得锁和参与事务的提交和回滚。书中给出了一个简单的资源管理器(一位资源管理器)来具体展示这方面的技术。第11章介绍事务管理器,它具体负责确定事务的状态和了解参与此事务的资源管理器的情况。本章给出了一个简单事务管理器的具体实现—当然对具体细节不感兴趣的读者同样可以略过这些内容。第12章是事务管理器所用到的高级概念和技术的汇总。
  第13~15章讨论一个相对独立的内容:一个非常重要的资源管理器—事务型文件系统的实现。从裸金属(磁盘)开始,讨论空间管理问题,并详细论述了系统中缓冲管理器的角色。接下来,介绍了在定长页面中变长元组的组织,以及支持面向元组存取的所有文件组织方式。最后,第15章讨论了关联存取,主要介绍B树及其在高并行环境下的实现问题。所有这些都以一种支持ACID特性的方式实现,即产生的文件、元组和存取路径均是事务型对象。
  第16章概述事务处理范畴内许多商业系统的情况。我们试图揭示每一系统的特征。这不是一个竞争性的比较,而是对每一系统优点的正面描述。
  最后,附有一个关于事务处理术语的词汇表。拥有如此大量的词汇,这在一般的教材中是不常见的。然而,正如第5章引言所指出的,事务处理领域的术语是全面而定义完好的。因此词汇表可以起到两个目的:首先,若对某个术语不明确,可查词汇表找到有关的解释。其次,通过这种方式,词汇表有助于促进本领域术语的统一。
  大多数章包含了一节历史评注,试图说明事情的由来、一些思想的首次出处等。与计算机科学的许多其他领域不同,事务处理技术主要是由工业界研究机构和开发实验室提出的。一些在商业产品中提出并实现的思想,是在若干年后被重新发现并作为科学成果加以发表的。在历史评注中,我们尽我们所知,尽量包含来自两方面的贡献。
  本书大部分后章还配有习题,小到简单的内容复习题,大到一个学期项目。其中大部分题目还在章尾给出了答案。仿照唐纳德·克努特的做法,对每一道题目有一个形如[节,级别]的修饰。“节”用于说明习题涉及哪一节的内容,“级别”用于指明习题的难度系数:
[10] 指可以在1分钟时间完成的题目(用于检查是否阅读了书中的有关内容)。
[20] 指可以在15~20分钟时间完成的题目。
[25] 指可以在1小时时间完成的题目。
[30] 指短的(程序设计)项目:可以在一天内完成。
[40] 指较大型的(程序设计)项目:可以在两周时间完成。
另外,对难度超过[40]的题目,用[项目]标识。而对标有[讨论]的题目,则需要读者走出去,好好地调查研究一番。
  本书原本的计划是要包含SQL的实现和有关事务的应用设计。随着写作的推进,我们意识到已没有空间和时间来讨论这些内容。于是,正如现在所看到的,本书就是一本关于事务如何实现的书。Ceri和Pelagatti有很出色的书[1984]讨论了高级别数据库的问题(如SQL、规范化、优化以及一些事务管理的问题)。

有关本书的学习
  本书主要面向高年级本科生、研究生和一些可能需要了解所用事务处理系统情况的专业程序员(如CICS/DB2用户)或需要一本基本参考书的专业程序人员。
  本书的内容在目前大学计算机科学的教学体系中没有对应的科目。分门别类是现有课程结构的本质特征,而且至今还没有标准的事务处理课程。然而,在本书的写作过程中,各个阶段的初稿已经被用于许多本科和研究生的课程中。我们认为我们所采用的写作方法在计算机科学现存结构中是合适的。但我们希望,这一方法的出现将有助于消除现有分门别类的思想。以下是将本书用于各种课程的建议:
基本了解:第1章,2.7、4.1~4.2、5.1~5.3、5.5~5.7节,第16章。
事务处理导论:第1、2章,3.1~3.6节,第4、5章,6.4~6.5、7.1~7.6节,第9、10、16章。
数据库系统:第1、4、7、10、13、14、15章。
分布式系统:第1、2、3、4、7、8、10、12、16章。
操作系统:第1、2、3、5、6、7、8、10、11、13、16章。
高级内容:在高级课程中,第1、3章可以略过,或者简要地过一遍。另外,可以采用Tanenbaum的有关操作系统和计算机网络的书,Ceri和Pelagatti的分布数据库的书,Oszu和Valduriez的分布数据库原理的书,和Date的任何一本数据库的书。
  当然还可以想到许多其他的组合方式。对已经熟悉本领域内容的读者,可以略过第1章、第2章;不过我们建议大家浏览一下这部分内容,以便了解本书用到的术语。
  第3章可以跳过,但我们建议大家阅读一下。事务乍看起来太显而易见。然而第3章仔细地阐述了为什么事务是正确的异常处理模型和开发高可用系统的关键。这里讨论的技术有助于更好地理解容错在系统级的含义,并且它们可以随时用于应用系统开发之中。
  我们在叙述中尽量保持各章内容互不依赖。如果你阅读了全书,就会发现各章间有一些重复内容。这保证了各章使用上的独立性。
为使本书更便于教学上的使用,教师可以考虑通过Transarc公司的Encina大学项目获取有关的软件。Encina产品提供了在开放计算环境中的基于分布、标准的联机事务处理。本书的很多内容可以使用Encina产品模块家族,以课程设计的形式具体实验。例如,分布事务管理、事务远程过程调用、高级锁和恢复模型、共享写日志系统、面向记录的资源管理器和事务监控器。
  若你有充裕的时间,并对事务处理有足够的兴趣,不妨读一下Bjork and Davies[1972;1973;1978]的论文。这些早期的论文开创了这一领域,以我们目前的观察,阅读这些论文会让我们受益匪浅。事务的演进不像一种自然衰减过程,而更像一种激进方式,力图减低难以管理的复杂性。阅读这些早期的基本论文,你还会发现其中的预见还远未成为现实。

结束语
  本书的初稿历经了两年时间(1990~1991)的评阅和教学试用。这不仅改进了本书内容的表述,增加了准确性,而且改变了本书的总体设计。一些新的章节增加进来,而另一些内容则被删掉了,书的厚度也增加了一倍。书的评审和热烈的辩论也改变了材料的组织方式。我们两个一个按自顶向下的方式开始写作,而另一个采用自底向上的方式写作。最后,我们两个互相颠倒了各自的写作方法。
 即使如此,错误依然存在,为此我们没有任何借口可以逃脱应有的责任。对发现本书的错误并不吝告知者,我们将不胜感激。请把意见寄给出版社转交作者,或发电子邮件给Gray@microsoft.com。

Jim Gray
Andreas Reuter
(斯图加特大学)

图书序言

中文版序言
  本书的基本前提在于,事务概念是分布式计算的一个重要抽象。在某一层次上实现了事务,那么所有更高的层次上会有一个简化的失败语义(要么全做,要么全不做),并且错误处理也会简单的多。
  十年前当本书初次面世时,这是一个基本的观点。自此以后,因特网蓬勃发展,分布式计算在CORBA、DCOM和现在的Web Service的支持下,变得更为切实可行。TP监控器已经被Web服务器和对象请求代理所取代。数据库系统也已经成熟多了。
  今天我们看到,许多技术都已接受了这一观点。事务技术被广泛用于操作系统、事务型文件系统,并且事务管理器被加入到了大多数的操作系统中。由于事务技术已经成熟,所以事务型资源管理器(如队列管理器、工作流系统、持久对象系统和主存数据库系统等)日益推广流行。
  本书中的一些内容已经过时了—甚至是作废了—但其核心概念和技术已从数据库系统扩展到了分布式计算的范畴。
  我和Andreas Reuter感谢译者的辛勤工作。中文,作为更为简洁的语言,会使本书更薄些(也更轻了),中文版还会使十多亿人有机会阅读本书。我希望本书对各位是有价值和有帮助的。

Jim Gray
微软研究院
2002.10



  企业、政府、科学、文化等领域的活动,正在变得越来越依赖于计算机信息资源。随着计算机系统获取和维护的信息量和种类日益增多,如何使用、管理和保护这些信息的技术对人类和现代工业社会变得至关重要。
  事务处理技术是有效管理和使用计算机信息资源的关键。
  事务处理涵盖了对所存储的信息和应用程序加以管理两方面的技术,其中应用程序负责对信息的解释和具体操作。从数据库恢复和并发控制,到事务监控器,负责初始化和控制应用的执行。这些事务处理技术为关键信息资源的管理和保护提供了必要的机制和措施,而这些关键信息资源其实已成为商业、科学、文化活动的基础。
  为使日益剧增的计算机信息有用,要求它们必须能够准确反映现实世界的情况,并能保证应用程序可获得它们。通常,使用所存储的信息是指访问和修改有关的数据,这些数据集中描述或刻画了现实世界中的某些现象或活动的状态和演化。由于许多数据要一起被访问和修改以便正确反映现实世界,因此必须保证相关数据的一致性。任何对相关数据修改的中断,或对相关数据访问或修改的交错,都会造成数据的不一致性。
  保证数据一致性的关键是要明确数据访问和更新的序列。这一序列称为事务。事务处理技术就是要确保一个事务要么完整地执行,要么根本不执行,并保证并发执行的事务彼此互不干扰,如同在隔离执行一样。这一技术的意义尤其在于,在一些复杂情况下上述保证仍能得到支持,如计算机部件发生故障、数据分布在不同计算机上或不同事务的交叉或并行执行等。
  过去25年中,企业和大学的实验室在事务处理技术方面付出了巨大的努力,已使得该技术可以保证事务的“all-or-nothing”(要么全做,要么全不做)执行,以及并发事务的隔离性。本书第一次全面介绍了事务处理系统的技术和方法,用来控制和保护事务处理系统管理的有价值的信息资源。作者详细描述了商品化的和实验性的事务处理系统的技术现状。重点论证了这些技术的有效性和高效性。详细解释了为什么要面对这些问题以及如何解决这些问题,所有这些使得本书不仅对求知的学生,而且对系统开发人员都是十分有益的。
  作者Jim Gray博士和Andreas Reuter教授,在商品化和实验性事务处理系统的实现技术方面,加起来已有五十多年的直接经验。他们对事务处理技术做出了巨大的贡献,并因他们的学术成就而享誉世界。本书既是他们对事务处理问题深刻理解的结晶,也是对大部分行之有效的事务处理实现技术的难得的评价。作者具有的对基本概念和使用方法的辨识能力,给读者理解事务处理系统的问题和技术,提供了坚实和实用的基础。
  本书覆盖了事务处理技术的所有方面。开始的几章为读者介绍了事务概念和事务执行的计算环境的基本知识,其中给出了有关计算机部件故障的重要假设,即事务处理系统必须对故障部件容错。书中阐述了事务处理监控器的作用。事务处理监控器主要控制应用程序和所提供功能的激活和执行。这为讨论并发控制和恢复技术打下了基础。事务隔离性的讨论覆盖了并发控制问题,它涉及了从硬件层到记录和索引的隔离语义的各方面问题。书中详细讨论了故障情况下重要而复杂的事务恢复技术。从记录管理到分布提交协议,对所需要的用于保证事务的“要么全做,要么全不做”执行和数据永久性的恢复技术详加阐述。其后,介绍了将事务恢复技术和隔离技术用于记录级存储和关联索引的设计与实现。从这些章中,数据库系统方面的学生和开发人员都可以获得有用的信息。本书最后,从商业和学术两个方面对事务处理系统加以综述。
贯穿全书,作者对基本问题给出了深入细致的讨论,对已证明行之有效的技术给出了详细具体的描述。对概念方面的内容,辅以一些仔细设计的图表加以说明。对技术方面的内容,则给出代码片段,有效提高了读者对实现问题的认识。
  本书既综合覆盖了事务处理技术,又详细描述了相关问题和算法,对学生是很好的教材,对专业人士则是资源宝库。事务处理技术对工业社会的信息管理需求十分重要,这需要人们对该技术深入理解和广泛应用。对于即将应用和拓展事务处理概念和技术的人士,本书可以充当这方面的指南和参考书。


Bruce Lindsay
IBM Almaden Research Center
圣荷塞,加利福尼亚

作者简介

(美)Jim Gray, Andreas Reute:Jim Gray: 由于Jim Gray在事务处理领域的突出贡献, 他于1998年获得“图灵奖”。目前在微软研究院工作,从事微软Back Office产品的改进研究。他的研究兴趣主要集中在可扩展系统和容错系统方面。20世纪80年代,他在Tandem工作,参与开发了系统字典、FastSort和NonStop SQL。20世纪70年代在IBM研究中心,他参与开发的项目有System R、SQL/DSDB2和IMS—Fast Path。此前他还在贝尔实验室工作过.并在加州大学伯克利分校获得博士学位。他在商业系统开发上卓有成效.同时在研究上也取得了诸多被大家广泛认可的成果。
Andreas Reute: 德国斯图加特大学并行与分布式高性能系统研究所教授, 从事将事务处理技术应用到非传统应用领域中大规模并行系统和并行程序设计的研究工作。此前他曾在凯泽斯劳滕大学和达姆施塔特工业大学任职,并在达姆施塔特工业大学获得博士学位。Reuter博士还从事过咨询顾问的工作.负责设计和实现专用数据库和事务系统。在过去的20年间.他与诸多公司合作过.如Digital、惠普、西门子和IBM.曾参与AMOEBA多处理器数据库事务系统项目。此外, 他还发表过很多关于性能分析、并发控制、恢复和事务模型等方面的论文。

译者简介

孟小峰 于戈 等:孟小峰: 1964年生,博士,教授,博士生导师,中国人民大学信息学院计算机系副主任。现任中国计算机学会理事、中国计算机学会数据库专委会委员秘书长、中国计算机学会青年计算机科技论坛(YOCSEF)学术委员会主席(2003~2004年)、《计算机研究与发展》编委、IEEE CS会员、ACM SIGMOD会员。曾先后在香港中文大学、香港城市大学、新加坡国立大学访问研究。主持或参加过十多项国家科技攻关项目、国家自然科学基金以及国家863项目。获国家科技进步二等奖1项、电子部科技进步特等奖1项、北京市科技进步二等奖2项、第七届“中创软件人才奖”等奖励。研制开发的主要软件产品有国产数据库系统COBASE、嵌入式移动数据库系统“小金灵”、中文自然语言查询系统NChiql、并行数据库系统PBASE/1等。近十年在国内外杂志及国际会议上发表论文60余篇,有关数据库方面的著译作7部。多次应邀担任国际会议ICDE'03、DASFAA'03-04、MDM'03-04、WISE'00、01、WAIM'01-03等的程序员委员会委员,并担任WAIM2002 程序委员会主席。近期主要研究领域为Web数据集成、XML数据库、移动数据管理等。
于戈: 1962年生,博士,教授,博士生导师。1982年和1985年于东北大学获学士和硕士学位;1996年于日本九州大学获工学博士学位。现任东北大学信息学院副院长兼计算机系系主任,中国计算机学会数据库专业委员会副主任委员、中国计算机学会青年计算机论坛学术委员会委员、沈阳市电脑协会副理事长、辽宁省计算机学会副理事长、中国电子学会高级会员、ACM会员、SIGMOD会员、IEEE 会员、IEEE CS会员、日本IPSJ学会会员、WAIM国际学术会议指导委员会委员,ICDE’2002、CODAS’2001等多届国际学术会议程序委员会委员,《东北大学学报》(自然科学版)、《控制与决策》、《控制工程》等学术期刊的编委。承担或完成了“基于CORBA软件总线的CIMS信息集成平台的研究”等10多项国家863课题、国家自然科学基金课题和“新一代数据库基础技术的研究”等多项国际合作课题。获得国家科技进步奖二等奖2项,省部级科技进步二等奖1项、三等奖2项。获得教育部“跨世纪优秀人才基金”、“霍英东青年教师基金”、“中国高校青年教师奖”。出版《分布式数据库》等专著和论文集4部,在《J. of Computer Sci. and Tech.》、《计算机学报》、《软件学报》等权威学术期刊和ICDE'06、DASFAA'05等著名国际会议上发表学术论文50余篇。

译者序

值此译稿完成之时,从DBWORLD惊悉关系模型的发明人E·F Codd博士于2003年4月18日不幸辞世(1923年~2003年)。人虽逝去,但关系模型这一知识财富却在造福着人类。在整个计算机软件领域,恐怕难以找到第二个像关系模型这样简单,但所带来的市场价值却如此巨大的概念。其实,传承这一发明并使之真正实用化的关键人物有两人:一是C·J Date,他使关系模型概念普及化,为大众所接受;另一个当属本书的作者之一Jim Gray博士,他使关系模型的技术实用化,为大众服务。在IBM工作期间,Jim Gray参与和主持过IMS、System R、 SQL/DS、DB2等项目的开发。其中,除了System R仅作为研究原型,没有成为产品外,其他几个项目都发展成数据库市场上有影响力的产品。这其中Jim Gray博士在事务处理技术方面的贡献功不可没。
  在关系数据库理论基本成熟后,各大公司在关系数据库管理系统(RDBMS)的实现和产品开发中都遇到一系列技术问题。主要是在数据库的规模愈来愈大,数据库的结构愈来愈复杂,又有愈来愈多的用户共享数据库的情况下,如何保障数据的完整性、安全性、并发性以及故障恢复的能力,这些问题成为数据库产品是否能实用化并最终为用户接受的关键因素。Jim Gray在解决这些重大技术问题,使RDBMS成熟并顺利进入市场的过程中,起到了关键性作用。概括地说,解决上述问题的主要技术手段和方法是:把对数据库的操作划分为称为“事务”的基本原子单位,一个事务要么全做,要么全不做(即all-or-nothing原则);用户在对数据库发出操作请求时,需要对有关的数据“加锁”,防止不同用户的操作之间互相干扰;在事务运行过程中,采用“日志”记录事务的运行状态,以便发生故障时进行恢复;对数据库的任何更新都采用“两阶段提交”策略。以上方法及其他各种方法总称为“事务处理技术”。Jim Gray在事务处理技术上的创造性思维和开拓性工作,使他成为这一领域公认的权威人士,并于1998年获得图灵奖,成为自图灵奖诞生32年来第三位因在数据库技术的发展中做出重大贡献而获此殊荣的学者(见《ACM图灵奖(1966~1999)》,高等教育出版社,2000年)。
本书即是Jim Gray博士和德国斯图加特大学Andreas Reuter教授多年来在事务处理领域所取得成就的结晶。本书有如下几个显著特征:
  内容的组织和叙述的方法独树一帜  计算机科学在其60多年的发展中已形成了一个综合性的学科体系,可分为硬件、软件、计算机原理、操作系统……等诸多领域。现有的书通常是某个学科领域的知识总结。本书却是一个例外。它好像是一位大师挥舞手中的巨擎,打破时空的界限,勾画出的印象派杰作。作者用一个系统实现者的眼光阐述有关问题,力图使读者“所学即能为我所用”,因此数据结构和程序片段在书中随处可见。它更注重实效,更加独树一帜。
  内容的广泛和技术的深入独一无二  本书的目的是解决如何建造大型的、分布的、异构的计算机系统的问题。事务处理技术只是作者阐述这一复杂问题的“一种集成的概念框架”,书中内容分为七个部分,即事务处理基础、容错技术、面向事务的计算、并发控制、恢复、资源管理器实例、系统综述;分别涉及计算机基本知识、数据库系统、分布式系统、操作系统等。该书的内容涉猎广泛,而在事务处理技术上讲述得深入透彻而且完整全面。本书更像是一本关于事务处理的小型百科全书,这在计算机界是独一无二的。
  技术的实践和学术的研究完美结合  其实本书在整体上主张技术实践优先论。事务处理是一个技术实践引导理论研究的领域。通常商业系统实现了某些思想之后很久,该思想才会在学术界出现。Jim Gray常年在工业界的研究机构工作,大部分时间从事实际系统的开发。他实际是在通过本书向进行学术研究的人们提个醒儿,计算机的技术创新应该从研究系统开始,两者的贡献是不分高下的。
  扎实的功底和渊博的知识力透纸背  书中叙述的有关“Sphere of Control”的概念闻所未闻(第4章,译为控制区域),事务理论详尽透彻(第7章),文件系统的实现滴水不漏(第13~15章)。在本书的翻译过程中,我们常常为作者深厚的功底和渊博的知识所折服,同时又为自己的知识欠缺而惭愧,自叹不能精确地传达作者精妙的论述。
当然本书也不是完美无缺的。由于本书的内容过多,在叙述上有些内容不够简练,有些内容的叙述甚至太过冗余。如事务的ACID特性,几乎每章都用到,但每次都要重新解释。这与本书的写作风格有关,力图使每章内容都相对保持独立。
 译者曾在2001年在罗马VLDB大会上有幸见到Jim Gray,谈到翻译本书的打算,得到他的极大鼓励,并在随后的版权购买过程中给予很大的帮助。2002年在北京再次见到Jim Gray博士,谈起我们的翻译工作已接近尾声,Jim 显得极为高兴,并欣然在回美国的旅途中给本书中译本作了序。
  本书涉及面广,内容丰富,术语量大,这在一般的书籍中是不常见的,翻译难度可想而知。本书译词主要遵从教科书中的习惯用法,并参考《英汉计算机词典》(修订本,1998)等。为了搞清其他领域(如容错、操作系统等)中的词汇,我们专门请教了一些这方面的专家。但在翻译中仍感力不从心,译文中不当之处在所难免。诚恳读者批评指正并不吝赐教。如果你有任何建议或意见,欢迎发Email给xfmeng@public.bta.net.cn, yuge@ mail.neu.edu.cn。


图书目录

第一部分  事务处理基础
第1章  概述 1
1.1  历史回顾 1
1.2  什么是事务处理系统 2
1.2.1  最终用户对事务处理系统的认识 4
1.2.2  管理员/操作员对事务处理系统的认识 6
1.2.3  应用设计者对事务处理系统的认识 8
1.2.4  从资源管理器角度对事务处理系统的认识 12
1.2.5  TP系统的核心服务 15
1.3  事务处理系统特征列表 16
1.3.1  应用开发特征 16
1.3.2  中心库特征 16
1.3.3  TP监控器的特征 20
1.3.4  数据通信特征 21
1.3.5  数据库特征 24
1.3.6  操作特征 29
1.3.7  教育和测试特征 29
1.3.8  特征小结 29
1.4  小结 30
1.5  历史评注 30
习题 32
答案 32
第2章  计算机系统基本术语 33
2.1  引言 33
2.2  基本硬件 33
2.2.1  存储器 35
2.2.2  处理器 41
2.2.3  通信硬件 42
2.2.4  硬件结构 43
2.3  基本软件—地址空间、进程、会话 45
2.3.1  地址空间 45
2.3.2  进程、保护域和线程 46
2.3.3  消息和会话 47
2.4  一般系统问题 48
2.4.1  客户和服务器 49
2.4.2  命名 50
2.4.3  认证 51
2.4.4  授权 52
2.4.5  调度和性能 52
2.4.6  小结 54
2.5  文件 54
2.5.1  文件操作 54
2.5.2  文件组织 55
2.5.3  分布式文件系统 56
2.5.4  SQL 56
2.6  软件性能 57
2.7  事务处理标准 58
2.7.1  可移植性标准和互操作性标准 58
2.7.2  API和 FAP 58
2.7.3  LU6.2, 一个事实标准 60
2.7.4  具有X/Open DTP的OSI-TP—正式标准 60
2.8  小结 62
习题 62
答案 64
第二部分  容错基础知识
第3章  容错 67
3.1  引言 67
3.1.1  简单概率概述 67
3.1.2  容错的外部观点 68
3.2  定义 71
3.2.1  故障、失败、可用性、可靠性 71
3.2.2  故障避免和容错的分类 72
3.2.3  修复、失败即停、模块性、
递归设计 72
3.3  实验研究 72
3.3.1  断供是非常少见的事件 73
3.3.2  传统系统研究 73
3.3.3  容错系统研究 74
3.4  典型模块失败率 76
3.5  容错的硬件措施 79
3.5.1  n工基本思想:怎样建立失败即停的模块 79
3.5.2  n工中的失败即停表决器与失败表决型表决器 80
3.5.3  n工与修复产生高可用性 81
3.5.4  表决器问题 83
3.5.5  小结 84
3.6  软件问题 85
3.6.1  N版本程序设计和软件容错 85
3.6.2  事务和软件容错 86
3.6.3  小结 87
3.7  故障模型和软件故障屏蔽 87
3.7.1  模型概览 88
3.7.2  建立高可用的存储 89
3.7.3  高可用的进程 94
3.7.4  基于会话和进程对的可靠消息 102
3.7.5  进程-消息-存储模型的小结 109
3.8  一般原理 110
3.9  一个警戒性的故事—系统错觉 110
3.10  小结 112
3.11  历史评注 112
习题 113
答案 115
第三部分  面向事务的计算
第4章  事务模型 117
4.1  引言 117
4.2  原子操作和扁平事务 118
4.2.1  将写磁盘作为原子操作 118
4.2.2  操作类型分类 120
4.2.3  扁平事务 121
4.2.4  扁平事务的局限性 125
4.3  控制区域 127
4.3.1  控制区域的定义 128
4.3.2  控制区域的动态行为 129
4.3.3  小结 131
4.4  一种解释事务模型的符号表示法 132
4.4.1  描述事务模型哪些是必需的 132
4.4.2  符号表示法的构成元素 134
4.4.3  用一套简单的规则定义事务模型 135
4.5  带保存点的扁平事务 136
4.5.1  关于保存点 137
4.5.2  开发保存点模型下的规则 138
4.5.3  持久性保存点 139
4.6  链事务 140
4.7  嵌套事务 142
4.7.1  嵌套结构的定义 142
4.7.2  嵌套事务的使用 145
4.7.3  通过保存点模仿嵌套事务 146
4.8  分布事务 147
4.9  多级别事务 148
4.9.1  补偿事务的角色 149
4.9.2  多级别事务的使用 150
4.10  开放嵌套事务 153
4.11  长事务 153
4.11.1  事务处理上下文 154
4.11.2  小批量 157
4.11.3  saga 158
4.12  特殊事务模型 159
4.13  小结 161
4.14  历史评注 161
习题 164
答案 167
第5章  事务处理监控器:概述 172
5.1  引言 172
5.2  事务系统中的TP监控器的角色 172
5.2.1  面向事务的计算方式 173
5.2.2  事务处理服务 178
5.2.3  事务处理系统进程结构 180
5.2.4  小结 184
5.3  TP监控器的结构 185
5.3.1  TP监控器组件 185
5.3.2  事务服务的组件 188
5.3.3  TP监控器对于资源管理器接口的支持 190
5.4  事务型远程过程调用:基本思想 191
5.4.1  远程过程调用中的参与者 191
5.4.2  远程过程调用句柄的地址空间结构 192
5.4.3  远程过程调用的动态过程 193
5.4.4  小结 195
5.5  事务编程风格的例子 196
5.5.1  基本的处理循环逻辑 196
5.5.2  与事务有关的资源管理器:
一个简单的例子 197
5.5.3  与事务有关的资源管理器:一个复杂的例子 202
5.5.4  使用持久保存点 203
5.6  专门术语的介绍 204
5.7  历史评注 205
习题 206
答案 207
第6章  事务处理监控器 209
6.1  介绍 209
6.2  事务型远程过程调用 211
6.2.1  资源管理器的接口 212
6.2.2  资源管理器对事务的支持 213
6.2.3  资源管理器和TP监控器之间的接口 215
6.2.4  资源管理器调用与资源管理器会话 217
6.2.5  小结 223
6.3  TP监控器的功能原理 223
6.3.1  TPOS的中心数据结构 224
6.3.2  TP监控器拥有的数据结构 228
6.3.3  TRPC路径的概览 233
6.3.4  中止竞争的TRPC 238
6.3.5  小结 238
6.4  管理请求和响应队列 239
6.4.1  映射资源管理器调用的短期队列 240
6.4.2  用于异步事务处理的永久性请求队列 242
6.4.3  小结 249
6.5  TP监控器的其他任务 250
6.5.1  负载平衡 250
6.5.2  认证和授权 255
6.5.3  重启处理 259
6.6  小结 261
6.7  历史评注 262
习题 264
答案 265
第四部分  并发控制
第7章  隔离性的概念 269
7.1  引言 269
7.2  隔离性的引入 269
7.3  隔离性的依赖模型 271
7.3.1  静态分配与动态分配 272
7.3.2  事务依赖 272
7.3.3  三种有害的依赖 273
7.3.4  隔离性的形式化模型 274
7.4  隔离性:应用程序员的观点 274
7.5  隔离性定理 275
7.5.1  操作与事务 276
7.5.2  规范事务和两阶段事务 276
7.5.3  事务的调度 277
7.5.4  合法的调度和锁的相容性 277
7.5.5  版本、依赖、依赖图 278
7.5.6  等价的和隔离的调度:BEFORE、AFTER和虫洞 279
7.5.7  虫洞事务不具有隔离性 280
7.5.8  定义小结 281
7.5.9  隔离定理的小结 285
7.6  隔离性的级别 286
7.6.1  隔离性级别的定理 286
7.6.2  SQL与隔离级别 287
7.6.3  低隔离级别的优缺点 288
7.6.4  特殊的SQL隔离—跳读锁和通知锁 290
7.7  幻像和谓词锁 291
7.8  粒度锁 292
7.8.1  基于树的封锁和意向锁类型 293
7.8.2  更新型锁 295
7.8.3  粒度锁小结 296
7.8.4  码区间封锁 296
7.8.5  动态码区间锁:前码和后码封锁 297
7.8.6  码区间锁需要DAG封锁 299
7.8.7  DAG封锁协议  300
7.8.8  基于DAG的粒度封锁的形式化定义 301
7.9  封锁的启发式算法 302
7.10  嵌套事务封锁 304
7.11  调度与死锁 305
7.11.1  护卫现象 305
7.11.2  死锁避免与检测 306
7.11.3  等待图和死锁检测 307
7.11.4  分布式死锁 308
7.11.5  死锁的概率 309
7.12  奇特方法 310
7.12.1  字段调用 310
7.12.2  契约封锁和其他字段调用改进 312
7.12.3  乐观和时间戳封锁 314
7.12.4  时间域寻址 314
7.13  小结 316
7.14  历史评注 317
习题 318
答案 320
第8章  锁的实现 323
8.1  引言 323
8.1.1  关于本章 323
8.1.2  锁管理程序中并行的必要性 323
8.1.3  资源管理器和锁管理程序的
地址空间 324
8.2  原子机指令 325
8.3  信号量 326
8.3.1  排他型信号量 327
8.3.2  蟹行:遍历共享数据结构 329
8.3.3  共享信号量 329
8.3.4  分配共享存储 332
8.3.5  信号量和异常 333
8.4  锁管理程序 334
8.4.1  锁名 334
8.4.2  锁队列和调度 335
8.4.3  锁长度和锁计数 337
8.4.4  锁管理程序接口和数据结构 338
8.4.5  锁管理程序的内部逻辑 339
8.4.6  锁升级和类属解锁、通知锁 344
8.4.7  事务保存点、提交和回滚 345
8.4.8  系统重启时的封锁 346
8.4.9  长生事务 347
8.4.10  锁管理程序配置和复杂性 347
8.4.11  锁管理程序小结 347
8.5  死锁检测 347
8.6  并行事务和并行嵌套事务封锁 349
8.7  小结 350
8.8  历史评注 350
习题 351
答案 353
第五部分  恢   复
第9章  日志管理程序 357
9.1  引言 357
9.1.1  日志的使用 357
9.1.2  日志管理程序概述 357
9.1.3  日志管理程序和其他服务的关系 358
9.1.4  为什么需要日志管理程序 359
9.2  日志表 360
9.2.1  映射日志表到文件 360
9.2.2  日志序号 361
9.3  日志的公共接口 362
9.3.1  日志表的存取授权 362
9.3.2  读日志表 363
9.3.3  写日志表 364
9.3.4  小结 364
9.4  日志读写的实现细节 365
9.4.1  读日志 366
9.4.2  日志锚点 366
9.4.3  与事务相关的锚点 367
9.4.4  日志插入 367
9.4.5  分配和刷新日志的守护进程 368
9.4.6  谨慎写:串行写和乒乓写 369
9.4.7  成组提交、批量式、集装式 370
9.4.8  WADS写入 370
9.4.9  多日志的事务管理器 371
9.4.10  小结 371
9.5  日志重启逻辑 371
9.5.1  保存事务管理器的锚点 372
9.5.2  准备重启:日志锚点的谨慎写 372
9.5.3  在重启时找到锚点和日志尾 373
9.6  日志归档 374
9.6.1  应当有多少联机日志表 374
9.6.2  用于回滚、重启、归档的底线 374
9.6.3  动态日志:副拷贝和正向拷贝 375
9.6.4  不影响并发事务的日志归档 376
9.6.5  电子转存和变化累积 376
9.6.6  处理日志管理程序—归档环路 377
9.7  客户-服务器体系结构的日志系统 378
9.8  小结 378
9.9  历史评注 379
习题 379
答案 381
第10章  事务管理器概念 384
10.1  引言 384
10.2  事务管理器的接口 384
10.2.1  事务的应用接口 385
10.2.2  事务的资源管理器接口 388
10.2.3  事务管理器的功能 389
10.3  事务型资源管理器概念 391
10.3.1  DO-UNDO-REDO协议 391
10.3.2  日志表和日志记录 392
10.3.3  通信会话恢复 393
10.3.4  值日志 396
10.3.5  逻辑日志 397
10.3.6  物理-逻辑日志 399
10.3.7  物理-逻辑日志规则:FIX、WAL和Force-Log-at-Commit 400
10.3.8  补偿日志记录 407
10.3.9  物理-逻辑REDO的幂等性 408
10.3.10  小结 409
10.4  两阶段提交:使计算具有原子性 409
10.4.1  集中式系统中的两阶段提交 410
10.4.2  分布式事务和两阶段提交 414
10.5  小结 418
10.6  历史评注 419
习题 420
答案 422
第11章  事务管理器结构 426
11.1  引言 426
11.2  正常处理 426
11.2.1  事务标识符 426
11.2.2  事务管理器的数据结构 427
11.2.3  MyTrid()、Status_Transaction()、
Leave_Transaction()和Resume_Transaction() 430
11.2.4  保存点日志记录 431
11. 2.5  Begin_Work() 432
11.2.6  局部Commit_Work() 432
11.2.7  远程Commit_Work():
Prepare()和Commit() 435
11.2.8  Save_Work()和Read_Context() 437
11.2.9  Rollback_Work() 438
11.3  检查点 440
11.3.1  清晰检查点 441
11.3.2  模糊检查点 442
11.3.3  事务管理器检查点 443
11.4  系统重启 444
11.4.1  重启时的事务状态 445
11.4.2  事务管理器的重启逻辑 445
11.4.3  资源管理器重启逻辑,Identify() 448
11.4.4  重启设计小结 450
11.4.5  独立的资源管理器 450
11.4.6  两检查点方法:一种不同的策略 450
11.4.7  重启为什么能奏效 452
11.4.8  分布式事务解决方法:重启时两阶段提交 453
11.4.9  加速重启 453
11.4.10  其他重启问题 454
11.5  资源管理器的失败与重启 454
11.6  归档恢复 455
11.7  配置事务管理器 456
11.8  小结 457
习题 457
答案 458
第12章  高级事务管理器主题 460
12.1  引言 460
12.2  异构型提交协调者 460
12.2.1  封闭式与开放式事务管理器 460
12.2.2  封闭式事务管理器的互操作性 461
12.2.3  编写开放式事务管理器的网关 463
12.2.4  事务网关小结 465
12.3  高可用性(非阻塞型)提交协调者 465
12.4  提交转移 467
12.5  两阶段提交的优化 469
12.5.1  只读提交优化 470
12.5.2  惰性提交优化 471
12.5.3  线性提交优化 471
12.6  远程场地的灾难恢复 471
12.6.1  系统对接管 473
12.6.2  接管时的会话切换 474
12.6.3  配置选项:一级安全、二级安全和极其安全 475
12.6.4  失败后的追赶处理 477
12.6.5  系统对设计小结 477
12.7  小结 478
12.8  历史评注 478
习题 479
答案 480
第六部分  事务型文件系统:一个资源管理器实例
第13章  文件和缓冲区管理 483
13.1  引言 483
13.2  文件系统作为事务永久存储的基础 484
13.2.1  外存与主存 484
13.2.2  本书使用的外部存储模型 488
13.2.3  事务型文件和数据库管理器中的
抽象层次 490
13.3  介质和文件管理 492
13.3.1  基本文件系统的对象和操作 492
13.3.2  磁盘空间管理 495
13.3.3  低层文件系统的目录管理 502
13.4  缓冲区管理 504
13.4.1  数据库缓冲区的工作原理 504
13.4.2  缓冲区管理器的实现问题 511
13.4.3  从缓冲区角度的写日志和恢复 519
13.4.4  缓冲区管理器性能优化 524
13.5  特殊问题 530
13.5.1  副文件 531
13.5.2  单级存储器 537
13.6  小结 541
13.7  历史评注 542
习题 544
答案 546
第14章  面向元组的文件系统 549
14.1  引言 549
14.2  元组到页面的映射 549
14.2.1  页面的内部组织 550
14.2.2  文件中空闲区的管理 554
14.2.3  元组标识 556
14.3  物理元组管理 562
14.3.1  属性值的物理表示 562
14.3.2  短元组的物理表示 564
14.3.3  元组属性值表示的特殊问题 573
14.3.4  长元组的物理表示 575
14.3.5  复杂元组和超长属性的物理表示 578
14.4  文件组织 581
14.4.1  管理型操作 582
14.4.2  扫描操作在不同文件组织上的抽象视图 584
14.4.3  顺序存取文件 589
14.4.4  系统顺序文件 594
14.4.5  相对文件 596
14.4.6  码顺序文件和散列文件 598
14.4.7 小结 598
14.5  特殊问题 599
14.5.1  聚簇文件 599
14.5.2  划分文件 600
14.5.3  使用事务来维护文件系统 601
14.5.4  目前数据库系统中的面向元组的文件系统 601
14.6  小结 602
习题 602
答案 604
第15章  存取路径 606
15.1  引言 606
15.2  实现关联存取路径的技术 607
15.3  通过散列文件进行关联存取 609
15.3.1  将码值折叠成数值型数据类型 610
15.3.2  评价散列函数的准则 611
15.3.3  散列文件的溢出处理 616
15.3.4  散列文件中页面的局部管理 618
15.3.5  散列关联存取的小结 619
15.4  B树 620
15.4.1  B树:基本思想 621
15.4.2  B树的性能方面 628
15.4.3  对B树的同步:面向页的观点 632
15.4.4  对B树的同步:面向元组的观点 634
15.4.5  B树的恢复操作 636
15.5  B树某些操作的实现样例 639
15.5.1  声明所有程序用到的数据结构 639
15.5.2  B树readkey()操作的实现 641
15.5.3  B树上的码区间封锁 642
15.5.4  B树插入操作的实现:简单实例 644
15.5.5  B树插入操作的实现:分裂实例 645
15.5.6  小结 647
15.6  特殊问题 647
15.6.1  可扩展散列 648
15.6.2  网格文件 652
15.6.3  hB树 656
15.7  小结 661
15.8  历史评注 661
习题 664
答案 666
第七部分  系 统 概 览
第16章  TP系统概览 669
16.1  引言 669
16.2  IMS 669
16.2.1  硬件和操作系统环境 670
16.2.2  工作流模型 671
16.2.3  程序隔离 674
16.2.4  主存数据库和字段调用 674
16.2.5  数据共享 675
16.2.6  改善的可用性与双工系统 675
16.2.7  DB2 677
16.2.8  IMS的最新演进 677
16.3  CICS和LU6.2 677
16.3.1  CICS概述 678
16.3.2  CICS服务 679
16.3.3  CICS工作流 680
16.3.4  CICS分布式事务处理 681
16.3.5  LU6.2 682
16.4  Guardian 90 684
16.4.1  Guardian:操作系统及硬件 685
16.4.2  Pathway、终端上下文和服务器类管理 686
16.4.3  事务管理 687
16.4.4  其他有意义的特性 692
16.5  DECdta 693
16.5.1  ACMS事务处理的三球工作流模型 693
16.5.2  ACMS服务 696
16.5.3  ACMS小结 697
16.5.4  VMS 的事务管理支持 698
16.5.5  DECdta小结 701
16.5.6  可靠的事务路由器 701
16.6  X/Open DTP、OSI-TP、CCR 703
16.6.1  局部情况 704
16.6.2  分布式情况:服务和服务器 705
16.6.3  小结 706
16.7  其他系统 706
16.7.1  通用事务管理器 706
16.7.2  ADABAS TPF 707
16.7.3  Encina 708
16.7.4  Tuxedo 710
16.8  小结 711
第八部分  附   录
附录A  参考文献 713
附录B  数据结构和接口 731
附录C  词汇表 738
索引 774

教学资源推荐
作者: 荣国平 张贺 邵栋 等编著
作者: 窦万峰,杨坤,许敏,缪静娴,钱辰
作者: (以色列)Doron A. Peled 著
参考读物推荐
作者: [美] 迪恩?莱芬韦尔(Dean Leffingwell)等著
作者: (美)Cem Kaner,James Bach,Bret Pettichord
作者: [美] 克里斯蒂娜·维代拉·洛佩斯(Cristina Videira Lopes)著