25. 组件服务及 Microsoft 分布式交易协调员
组件服务概述
Microsoft 分布式交易协调员
本章总结
本章将学习 Microsoft 分布式交易协调员(Microsoft Distributed Transaction Coordinator,MS DTC),这项功能允许一个数据库交易可以存取多个资料来源,并且还能确保数据的完整性。您在这一章会看到 MS DTC 有许多用途,很多类型的应用程序都必须用到 MS DTC 提供的服务。
MS DTC 是组件服务的一个部份。组件服务由 Microsoft Windows NT 服务衍生而来,是内建于 Windows 2000 产品与技术的集合。组件服务包含了 Component Object Model(COM)、Distributed COM(DCOM)、Microsoft Transaction Server、Microsoft Internet Information Server 及 Microsoft Message Queue Server。在 Windows 2000 组件服务中,COM 和 DCOM 的技术有了新的层级,所以称 COM+。COM+ 应用程序和其它的系统服务组成 Windows 2000 组件服务这个项目。在正式介绍 MS DTC 之前,我们会先简单介绍组件服务。
组件服务概述

组件服务(Component Services) 是由数个不同的产品组合而成的工具,使用统一的 Microsoft 管理主控台(Microsoft Management Console,MMC)管理窗口。组件服务是主控台的一个嵌入式管理单元,服务内容包括:
COM+ 应用程序服务

MS DTC

事件检视器服务

系统服务

Microsoft 讯息队列

要执行组件服务管理工具,按一下 开始 → 程序集 → 系统管理工具 ,然后选择 组件服务 启动主控台,如图 25-1。



图25-1 「组件服务」主控台
COM+ 应用程序服务

COM+ 应用程序服务 是指利用 Microsoft 的 COM+ 规格开发出来的应用程序。COM+ 是 COM 模块的延伸。COM 就是用于分布式应用程序的开发,发展到 COM+,让安全性及队列组件更容易在应用程序上开发。
您可以在组件服务 MMC 设定您的 COM+ 应用程序组件。依下列步骤进入您的 COM+ 应用程序(如图 25-2):展开 组件服务 → 计算机 → 我的计算机 → COM+ 应用程序 。
在屏幕上您会看到所有注册过的 COM+ 应用程序。在展开您 COM+ 应用程序的数据夹后,就可以选择进入这些应用程序。



图25-2 组件服务主控台窗口内的 COM+ 应用程序
MS DTC

在刚刚看到的组件服务主控台窗口,COM+ 应用程序数据夹的下面的就是 MS DTC 的数据夹。我们会在下一节详细讨论 MS DTC,这一节就先不赘述。
事件检视器服务

这项服务工具是由 Window NT 的事件检视工具开发而来。在 Windows 2000 的事件检视器服务和在 Windows NT 的事件检视相同,允许您进入事件记录中存取数据。所有的应用程序、安全性数据、系统错误及信息数据都会存放在事件记录中,我们必须随时检查这些记录。您可以在组件服务的窗口中找到事件检视数据夹,展开此数据夹(如图 25-3),点选欲检视的的事件记录即可检视数据。



图25-3 事件检视数据夹窗口
系统服务

系统服务工具是由 Windows NT 服务工具发展而来。系统服务可让您检视与管理安装在系统上的所有服务工具。当您展开 服务 数据夹即可检视系统服务(如图 25-4)。



图25-4 展开 服务 数据夹检视系统服务工具。
如果要启动或是停止服务工具,点选服务工具后按鼠标右钮,在快捷菜单中选取欲执行的选项(如图 25-5)。



图25-5 快捷菜单
如果要检视或修改服务工具的属性,在上图中的快捷菜单内选取 属性 ,叫出服务工具的 属性 窗口(如图 25-6)。



图25-6 服务属性中「一般」页签的窗口
在 一般 的窗口,可以改变服务工具设定内容,也可以停止或暂停服务工具。其它的标签页允许更改该项服务登入 Windows 2000 的方式。 属性 对服务工具来说很重要。在这个设定内,可以选择当系统开启是否自动启动服务工具,或是变更 SQL Server 和 MS DTC 所使用的账户。此外,也可以指定当服务工具出现问题时该执行什么动作。在这个窗口中您还可以检视各服务间的依存性。
Microsoft 讯息队列

虽然服务组件 MMC 没有显示 Microsoft讯息队列(MSMQ),但因为它也利用到 MS DTC 作外部交易,因此可视为组件服务的一部份。Microsoft 讯息队列允许讯息在不同的应用程序或系统间传递交易或非交易式的讯息。应用程序利用讯息队列,在服务器间递送 耐久 讯息(durable message)。耐久讯息的意思是这个讯息不会因系统失败(如因断电而故障)而消失。假设系统突然断电,当系统回复时,MSMQ 会继续执行讯息队列。Microsoft 讯息队列利用 储存并转送(store-and-forward) 的方式来递送讯息,这种方式即使是在网络产生问题时,讯息依然会储存在队列中。讯息队列的其它功能如下:
可不联机送讯 :要利用讯息队列组件递送讯息,不代表必须联机;此外,讯息可以路由,这样就可以在不同通讯协议间建立连结。

可动态队列管理 :在新增或更改队列时不需重新启动讯息队列。

可排列讯息优先级 :讯息队列可依优先级将讯息排序,可以设定先传送高优先级讯息。

可以支持丛集 :讯息队列可侦测丛集,支持主动/主动(active/active)和主动/被动(active/passive)丛集。

可与 Active Directory 目录整合 :讯息队列可以利用在 Active Directory 中的目录服务。

可与 MSMQ 1 沟通 :讯息队列可与 MSMQ 1 沟通,MSMQ 1 是讯息队列前身。

可与 Windows 2000 安全×××整合 :可利用 Windows 2000 强化后的安全功能。

讯息备份与回复 :可以将讯息备份,当系统发生问题也可以回复讯息。

使用 MMC 进行管理 :现在讯息队列管理功能和其它很多管理工具相同,都内嵌在主控台进行。

如您所见,Microsoft 讯息队列系统支持很多功能。不过本章会将学习重点放在讯息队列中的交易讯息组件,也就是 MS DTC。
Microsoft 分布式交易协调员

之前曾经提到,MS DTC 是 Windows 2000 组件服务的一部份。(MS DTC 这个观念在 SQL Server 7 就已经存在。)组件服务也包含 COM+。COM+ 是用于有非交易式通讯需求时,而 MS DTC 则用于有交易式讯息通讯需求时。
MS DTC 主要用来处理分布式交易。所谓 分布式交易 ,就是跨越两个或多个数据库的单一 SQL Server 内部的交易,这些数据库可以放在相同或分别放在不同的计算机系统内。而在同一个数据库内不同数据表间的交易,则不能称作分布式交易。在同一个系统上,数据库与数据库间的前端交易可利用一般(非分布式)处理;但是 SQL 在执行时仍会以分布式交易处理。
MS DTC 概观

当一笔交易包含许多不同来源的数据时,就必须协调这些提供数据的应用程序。协调的重要性在于确保交易必须是不可部份完成。换句话说,数据的修改不是全部执行,就是全部不执行。如果一笔交易部份完成,部份失败,就会造成交易逻辑没有一致性,还可能使数据流失。MS DTC 执行 两阶段交易认可(Two-Phase Commit) 确认交易逻辑。
两阶段交易认可近年来在技术上有很大的改革,这并不是新的技术,也非 SQL Server 独有。事实上,因 SQL Server 和 Oracle 两种数据库皆支持两阶段交易认可的模式及 ODBC,因此两种数据库间还可利用两阶段交易认可进行分布式交易。
两阶段交易认可的两个阶段分别为:准备阶段与认可阶段。在应用程序中以 COMMIT 指令初始化 MS DTC 执行两阶段交易认可。一台 SQL Server 上的 MS DTC,与另一个系统上的 MS DTC 协调处理一笔分布式交易。MS DTC 中处理两段交易认可的组件称作 资源管理员 。
当您执行了认可(COMMIT)指令,MS DTC 通知资源管理员开始 准备阶段 。第一阶段(也就是准备阶段),会执行所有认可所需要的动作,包括排清缓冲区和写入交易记录文件等动作。这个阶段所执行的步骤和一般的标准认可步骤类似,唯一不同的是在这里,SQL Server 不会真的认可交易,也不会对交易所用到的资源解除锁定。当所有认可交易的前置动作都完成时,资源管理员便传送准备成功的讯号给交易管理员。在所有的资源管理员都传出成功的讯号时,就进入认可阶段。
认可阶段 在分布式系统中进行。在这个阶段,如果所有的资源管理员都传出成功讯号,应用程序端就会接受到认可成功的讯息;如果其中有一个资源管理员传出失败讯号,就会传送 复原(rollback) 指令给每位资源管理员,这时应用程序端就会收到认可失败的讯息。当系统交易时间过长,也会执行复原指令。当一个系统内的认可失败,分布式交易中所有其它相关系统也会执行复原指令。
MS DTC 使用范例

在这一节,我们来参考两个现实生活中用到 MS DTC 的范例,您可以看到 MS DTC 在分布式交易中的重要性,以及系统如何处理不成功的交易。
________________________________________
真实世界 银行交易
以银行间的汇款交易来说,当客户要将 A 银行账户 1 的钱汇入 B 银行账户 2 时,就银行的计算机来说就得执行两项交易:把钱从账户 1 扣除,然后把钱加入账户 2。



先来谈谈如何汇款。如果两个账户都在同一家银行,系统只要更新一个数据库的数据即可;但是如果两个账户各为不同的银行,就得启动远程交易,这笔交易对系统来说,就得处理两个交易步骤,交易可在两个系统中的其中一个系统进行,也可以在第三个系统(客户端系统)上进行。



当银行员在客户端计算机的应用程序上执行交易,应用程序开始呼叫 SQL 执行任务,SQL 会开始执行下列项目:
1. 更新系统 A,把账户 1 的金额扣除
2. 认可交易
3. 更新系统 B,把金额加入账户 2
4. 认可交易
在确定每个系统运作都完全正常的情况下,这样的运作方式是可以接受的,但却并不是一个完全安全的运作方式。例如,如果只有一个系统完成了交易,但另一个系统交易失败。以下是可能发生的情形:
系统 A 的交易步骤失败,系统 B 的交易无法执行,转帐失败。

系统 A 的交易步骤成功,但系统 B 的交易失败,金额就此消失。

这样的交易情况当然不容发生。所以下列的交易步骤才算是安全的交易程序。
1. 更新系统 A,把账户 1 的金额扣除
2. 更新系统 B,把金额加入账户 2
3. 把上述两个步骤当作一组交易程序来认可,全部认可或是全部不认可。
MS DTC 可以让您将分布式交易的认可设定为一组来认可,也就是说您可以认可一组交易步骤,如果其中一个交易步骤出了问题,就执行复原指令,这样就不会产生上述的错误。
________________________________________
________________________________________
真实世界 电子商务应用程序
电子商务的应用程序常需要同时处理大量同时发生的在线交易行为,因此需要数个系统应付庞大的交易量。一家公司如果只用一台计算机系统来应付所有的交易,并不适合,以下是一家公司可能遇到的各种状况:
一个系统负载过重 :每台计算机和系统都有一定的负荷量,太多的交易量容易造成单一的计算机及系统超载。

商业逻辑 :以商业逻辑而言,将不同的功能分放在不同的系统上是较合理的做法。例如,可以把使用者数据放在一个系统,产品数据放在另一个系统。

委外 :电子商务常运用委外的功能。例如,会计部分可能是委外至会计师事务所。

当交易需要跨越多个系统(或是一个系统里的多个数据库),就会运用分布式交易存取系统数据(或数据库)。如果不运用 MS DTC,就无法确保系统交易的不可部分完成性。
现在来看看电子商务交易如何运用分布式交易。这个范例的客户以信用卡在网络商家购物。我们来看看完成一笔交易要经过哪些步骤。
________________________________________
________________________________________
说明
电子商务的交易方式有很多种,我们这里用到的范例仅供教学参考,不代表是最佳的交易方式。
________________________________________
________________________________________
1. 客户透过网络连上网络商家的网站,还未正式进入商家的数据库。
2. 客户选择商品 A,放入电子购物车中。
3. 要完成上述动作,计算机内部就必须进入数据库执行两项交易步骤。
a. 搜寻步骤,找出客户是新客户或是旧客户,如果是旧客户就取出其 Cust_ID 的相关数据。(有些应用程序在购买步骤时,才进行搜寻步骤。)
b. 把商品 A 放入购物车数据表。
4. 当客户准备结帐,一笔交易或一组交易数据库开始执行下列运作:
a. 读取购物车数据表,找出客户购买的商品项目。
b. 更新订单数据表,确认新增的订单已加入数据表。
c. 更新客户数据库,确认账单会寄给客户。在这个范例,客户数据和订单数据是在两个不同的数据库内,所以就会运用到分布式交易。
d. 在购物车数据表中,将此商品从记录内删除。(有些应用程序在批处理时才将记录删除。)
e. 当账户数据表和订单数据表更新完成,才开始认可交易,完成分布式交易。
5. 现在,电子商家会进入货仓的数据库,备货及准备出货,完成这个程序的细节如下:
a. 查询及取出订单数据表。
b. 将查询到的货品装箱准备出货。
c. 电子商家的系统连接到信用卡处理器作付费要求。这样的交易模式也算分布式交易,因为付费要求是记录在本机端。(有些应用程序在客户结算时就先作付费要求,这样的方法并不是一般的正常程序,因为在结算时就和信用卡中心联机要求授权,会拉长交易时间。)
d. 更新订单数据表与数据库后准备出货。
6. 货物成功到达客户手中。
在这个交易中如果没有使用 MS DTC 作两阶段交易认可,就可能会产生以下的问题:
o 付费要求步骤认可成功,但订单数据表与数据库的更新过程认可失败,造成已付费但没出货。

o 付费要求步骤认可失败,但订单数据表与数据库更新步骤认可成功,造成出货却没收到钱。

o 出货步骤认可成功,但其实货还没出。

所以分布式交易最重要的一点就是确认交易中的每个数据库都要一并更新,不然就得一并不更新。若是交易过程没有协调,数据库之间就失去一致性,并造成很多错误。
________________________________________
MS DTC 属性

之前提到 MS DTC 在交易过程中的重要性。这里我们将讨论启动 MS DTC 的几种方法。
呼叫包含于分布式交易中的远程程序

利用 Transact-SQL(T-SQL)指令来启动分布式交易

在多个 OLE DB 数据来源更新数据

在您的应用程序中内嵌 MS DTC 指令

这三种方法可以让您在系统上执行分布式交易(如图 25-7)。交易初始化端的 SQL Server 执行个体将会执行所有呼叫 MS DTC 的必要操作以执行分布式交易,这个动作不需手动执行,SQL Server 会帮您打理一切细节。



图25-7 SQL Server 中初始化分布式交易
如果您用最后一种方法来启动分布式交易,客户端的应用程序接口及网络上的 SQL Server 接口会和 MS DTC 及 SQL Server 沟通。SQL Server 客户端会帮助协调分布式交易。图 25-8 为分布式交易的架构。



图25-8 在应用程序中内嵌 MS DTC 指令以初始化分布式交易
MS DTC 程序设计

本书不是针对程序设计者而写,所以不会在如何运用及设计分布式交易方面着墨太多;不过,本节会简单列出几种可以启动分布式交易的方法,并用简单的交易测试 MS DTC。
下列几种动作均可启动分布式交易:
在一笔交易中存取远程数据来源 :这样一来,这笔交易就会升级为分布式交易。在一笔交易内,任何分布式查询都会将交易升级为分布式交易。

执行 BEGIN DISTRIBUTED TRANSACTION 指令 :即可马上产生分布式交易。

使用 SQL Server 安装选项中的 REMOTE_PROC_TRAN-SACTION 选项 :执行远程呼叫程序会马上将交易升级为分布式交易。

呼叫 OLE DB 或 ODBC 函数 :OLE DB 和 SQL Server 有启动分布式交易的语法。

透过 T-SQL 进行分布式交易,可以测试 MS DTC。您可以利用 T-SQL 的 BEGIN DISTRIBUTED TRANSACTION 指令启动分布式交易,用 COMMIT 指令执行认可,程序如下:
BEGIN DISTRIBUTED TRANSACTION
SELECT EmployeeID FROM Northwind.dbo.Employees
SELECT emp_id FROM pubs.dbo.employee
GO
COMMIT
GO
先输入前四行的程序代码,执行后再输入最后两行程序代码。这样您可以先在分布式交易协调员(在组件服务 MMC)数据夹中的 异动清单 数据夹,检视交易。要检视这个数据夹,请展开 组件服务 → 计算机 → 我的计算机 ,最后展开 组件服务 主控台中的 Distributed Transaction Coordinator 。当交易检视完成,再输入上述 T-SQL 程序代码中的最后两行。注意,现在交易认可后,在 异动清单 数据夹就找不到这笔交易。当然,大部分的分布式交易过程是很复杂的(包括更新和插入),并不如范例这么简单。这个范例仅在不变更任何数据表的情况下提供简单的测试方式。
一般来说,分布式交易都会在一个程序中使用 ODBC 或 DB-LIB API 来呼叫启动或停止交易。分布式交易的程序设计和其它交易有一点不同的地方,就是当交易建立时必须联机,并将自动认可选项关闭,以避免 SQL 陈述式自动认可交易。当应用程序结束在 COMMIT 或 ROLLBACK 其中一个指令时,MS DTC 便开始进行两阶段交易认可。
________________________________________
相关信息
有关 SQL Server 应用程序开发,可参阅 Ron Soukup 和 Kalen Delaney 合着的《Inside Microsoft SQL Server 7.0》(Microsoft Press, 1999);如果您使用的程序语言是 Microsoft Visual Basic,可参考 William Vaughn 所著的《Hitchhiker's Guide to Visual Basic and SQL Server》(Microsoft Press, 1998)。
________________________________________
管理 MS DTC

MS DTC 是 Windows 2000 的安装选项。如果需要用到这个服务,只要再安装时点选即可。有两种启动 MS DTC 的方式:使用 SQL 服务管理员或利用系统服务组件中的组件服务(本章稍早有介绍)。要开启 SQL Server 服务管理员工具,点选 开始 → 程序集 → Microsoft SQL Server → 服务管理员 ,图 25-9 为服务管理员工具。



图25-9 使用 SQL Server 服务管理员开启 MS DTC
在 服务 下拉式选单选取 MS DTC 。按下 开始/继续 就可启动此服务项目,按下 停止 即可终止服务项目。您可在左下方的复选框中选择是否在开机时自动启动服务。
监控 MS DTC

欲监控 MS DTC,必须使用组件服务管理主控台。启动主控台(如本章之前所示范),展开 组件服务 → 计算机 → 我的计算机 → Distributed Transaction Coordinator ,如图 25-10 所示。



图25-10 组件服务中的「Distributed Transaction Coordinator」
在这个数据夹中可以看到两个选项: 异动清单 和 异动统计 。
异动清单

异动清单 (如图 25-11 所示)为所有正在系统内执行分布式交易的清单,检视一笔交易的属性,并可以强制执行交易的认可或放弃。操作方式为在 异动清单 中按一下鼠标右钮,由快捷菜单中选出适合的选项。



图25-11 「异动清单」显示 MS DTC 交易
异动统计

异动统计 (如图 25-12 所示)可检视分布式交易的信息,如进行中的交易笔数、最大使用量等,提供进行中分布式交易的概观,对未来容量的规划也有帮助。如您所见,分布式交易的监控、建立与执行并不困难。



图25-12 「异动统计」显示 MS DTC 交易
本章总结

在本章中,学到 MS DTC 的运作与分布式交易的建立,也对 Windows 2000 所提供的组件服务和技术有基本的概念,此外还学到管理部分的组件服务。以下几章将学习 SQL Server 复写。