引言
编写应用程序是很难的。随着时间的推移,我们不断发掘允许建立大型应用程序的概念和技术。模块化,或者说将应用程序构建成独立的模块,使我们得以由简单的部分构建复杂的系统,并使软件得到重复使用。面向对象概念和 Microsoft® 组件对象模块 (COM) 可提供编写模块化应用程序的技术。
当某个应用程序构建为组件时,各个单独部分可共同驻留在单台计算机上,也可通过远程过程调用在网络上相互作用。因此,组件同时提供了模块化和自然分布。
将应用程序构建成独立的组件会产生组件的管理问题。单个程序失败后,将作为一个单位重新启动。但在使用模块化系统时,一个组件的失败不应当破坏其它组件。这就必须有隔离故障和限制故障传播的方法。事务提供了模块化执行方式,因此简化了故障处理,并使故障处理自动实现。它们同时为执行者和用户提供了简单的概念化执行框架。
用户认为事务是单个的要么发生或要么不发生的更改事件。执行者认为事务是一种允许他们编写能参与分布式计算的模块的编程形式。假定您要将资金从一个银行帐户转到另一个帐户。执行者和用户需要确保两个帐户都更改或都不更改。在分布式系统中很难完成这项工作 - 计算机可能失败,并且会丢失信息。事务提供了一种方法,能够将一组操作集合成具有原子性的执行单位。
原子性要么全有要么全无的属性并不新鲜:它在生活中随处可见。例如,如果输入一个合同,escrow(由第三者保存附带条件委付盖印的契约)官员将协调这项事务:escrow 官员会收集此合同每一方的签字。当 escrow 官员宣布所有人都已签字后,此合同就完成了。主持结婚典礼的牧师先问新娘和新郎“愿意此人成为您的配偶吗?” 如果他们都回答“愿意”,牧师就会宣布他们结婚。电影导演在某一场景会先问“布景准备好了吗?” 如果都回答已准备好,导演就会喊“开拍!” 在帆船上预备掉转航向的舵手会先问船员,“准备好转向了吗?” 如果都回答已准备好,舵手就会喊“转舵!”,改变船的方向。
这些情景说明了事务的基本原理:几个独立的实体必须达成一致。如果任何一方不同意,交易就会失败。一旦同意后,事务就会发生。Microsoft Distributed Transaction Coordinator (MS® DTC) 为 COM 结构的其它组件执行这项事务协调任务。
在 MS DTC 术语中,执行者被称为事务管理器。在执行事务保护资源的事务中,其参与者(如关系数据库)被称为资源管理器。
应用程序通过调用事务管理器的 BeginTransaction 方法开始事务。这样可创建一个代表事务的事务对象。然后应用程序会调用资源管理器来完成事务工作。
应用程序对每个资源管理器的第一次调用确定应用程序的当前事务。例如,如果应用程序在使用关系数据库,它会调用 ODBC 接口,此接口将事务对象与 ODBC 连接关联起来。在此之后,所有通过此连接的数据库调用都会代表该事务执行,直到该事务结束为止。
当某个资源管理器首先代表某个事务工作时,会通过调用事务管理器“登记”到该事务中。随着事务的发展,事务管理器会跟踪每个登记到该事务中的资源管理器。
通常,应用程序用 Commit 事务方法来完成事务。如果应用程序无法完成,则调用 Abort 事务方法,该方法可以撤消事务的操作。如果应用程序失败,MS DTC 就会放弃此事务。
当应用程序成功地完成事务的工作后,它会调用 MS DTC 来“提交”事务。然后 MS DTC 会仔细检查“两阶段” “提交协议”,使所有已登记的资源管理器都提交。两阶段提交协议可确保所有的资源管理器提交此事务,或全都放弃此事务。在第一阶段,MS DTC 询问每个资源管理器是否“准备”提交。如果所有参与者都回答“是”,那么在第二阶段 MS DTC 将向所有参与者广播提交信息。如果事务的任何部分失败,或资源管理器响应准备请求失败,或资源管理器响应“否”,那么 MS DTC 将通知所有资源管理器该事务已被放弃。
事务管理器是大多数数据库系统的关键部分。事务管理器还是某些操作系统的可选部分。Microsoft 相信事务对分布式应用至关重要 - 事务提供了模块化执行,从而使 COM 模块化编程更加完备。Microsoft 提供 Microsoft Windows® 95 和 Microsoft Windows NT® 操作系统的事务管理软件。
将事务概念与 COM 必需的创新相结合。传统的事务系统要求具有很高的安装和管理技巧。而集成 MS DTC 与 Microsoft 操作系统的难点是自动实现安装、管理和使用。许多概念和技术必须针对新的客户/服务器、面向对象和可视化管理环境重新创造。
在第一版中,MS DTC 使用了一个资源管理器:Microsoft SQL Server®。它还使用了几个事务处理监视器,包括 Encina®、Top End 和 TUXEDO®。MS DTC 实现 OLE 事务接口。所有 OLE 事务接口都是公用的,因此任何资源管理器都可以变成 OLE 事务资源管理器。将来,Microsoft 和其它软件公司将增加其它事务资源管理器,比如分布式对象系统、事务文件系统、事务队列系统及业务流程管理系统。