📄 207001.htm
字号:
<html><body><span id=Layer1><p><font size=2 color=#3c3c3c face=arial>存取资料对许多应用程式来说是相当重要的。只要资料能够存取,生活就变得简单多了。然而,当应用程式需要对资料进行变动时,事情就变得复杂许多。举例来说,如</span><span id=Layer2> <a target='_new' href=206.htm#>前章</span><span id=Layer3></a> 所述,通常变动的情形都是一连串发生的,所有的变动都该执行,或者是没有任何变动该进行。换句话说,对资料的修改动作通常都会包装成交易来执行。通常应用程式在一个特定的交易中进行的所有变动都是由相同的DBMS处理,而DBMS本身支援交易,同时客户端可以透过一个介面来存取这个交易服务,如ADO。不过若应用程式希望更动两个存在於不同电脑上,由不同的DBMS管理的资料库时又该怎麽办呢?举例来说,回顾前述转帐的范例,在这个范例中将从存款帐户转帐到支票帐户。假设维护的动作是在不同的DBMS,存款帐户是在Microsoft Windows 2000伺服器机器上的Microsoft SQL Server资料库,而支票帐户则是存放在UNIX系统上的Oracle资料库。因为没有一个资料库会知道发生了什麽事,金钱如何才能在一个单一的交易中,从一个帐户转帐到另一个帐户呢?或者假设一个应用程式要将资料库更新动作与其它工作结合在一起,如透过Microsoft Message Queuing (MSMQ)传送一个讯息,然後确保这两个事件若没有全部成功,便全部失败。交易机制涵盖了除资料变动动作以外的许多其它事情,因此再次地强调,单一DBMS所提供的交易机制并不足够,我们需要的更多。</span><span id=Layer4></font></p><p><font size=2 color=#3c3c3c face=arial>两个或多个事件(如更改资料)可以包装在一个交易中</span><span id=Layer5></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>两个或多个事件(如更改资料)可以包装在一个交易中</span><span id=Layer6></font></p><hr><p><font size=2 color=#3c3c3c face=arial>跨多个资料,或不同技术的交易带来特殊的问题</span><span id=Layer7></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>跨多个资料,或不同技术的交易带来特殊的问题</span><span id=Layer8></font></p><hr><p><font size=2 color=#3c3c3c face=arial>必要的事情包括了追踪特定交易中所有的参加者,即使是跨多台机器的分散式的交易,然後以协调者的身份自居,确保所有的参加者都做了相同的事,不是确认交易,就是取消交易。在Windows 2000平台上,这个工作是交由Microsoft Distributed Transaction Coordinator (DTC)来完成的。DTC对Windows 2000来说不是新东西,不过它是这个作业系统提供的主要分散服务。</span><span id=Layer9></font></p><p><font size=2 color=#3c3c3c face=arial>DTC能够确保一个分散式交易中的所有参加者都做了正确的事</span><span id=Layer10></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>DTC能够确保一个分散式交易中的所有参加者都做了正确的事</span><span id=Layer11></font></p><hr><p><font size=2 color=#3c3c3c face=arial>值得注意的是,虽然应用程式可以直接使用DTC,但这是很罕见的。取代的作法,通常需要进行分散式交易的应用程式需依赖於COM runtime提供的交易服务(Transaction Service),它建构在DTC之上,不过对应用程式程式设计师来说是它隐藏起来的。运作的情形将在</span><span id=Layer12> <a target='_new' href=208.htm#>下一章</span><span id=Layer13></a> 讨论。不过,若要了解COM如何使用交易,终究还是得知道DTC是如何运作的,因为这些理由,DTC值得探讨一番。</span><span id=Layer14></font></p><p><font size=2 color=#3c3c3c face=arial>DTC通常是给COM runtime使用的,而不是让应用程式设计师直接使用的</span><span id=Layer15></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>DTC通常是给COM runtime使用的,而不是让应用程式设计师直接使用的</span><span id=Layer16></font></p><hr><a name=207001><font color=#3e70d7 face=arial size=5><b>DTC环境</span><span id=Layer17></b></font><p><font size=2 color=#3c3c3c face=arial>如图7-1所示,任何执行Windows 2000作业平台的电脑都可以执行一个DTC交易管理员(Transaction Manager)。客户端应用程式可以透过一些COM介面直接存取单机的DTC交易管理员,这些介面称为OLE Transactions。</span><span id=Layer18></font></p><p><font size=2 color=#3c3c3c face=arial>DTC交易管理员可透过OLE Transactions存取,它是一组COM介面</span><span id=Layer19></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>DTC交易管理员可透过OLE Transactions存取,它是一组COM介面</span><span id=Layer20></font></p><hr><p><font size=2 color=#3c3c3c face=arial>当Microsoft将OLE标签套用到以COM为基础的技术时,OLE Transactions就类似OLE资料库,它的名称来自於历史的遗迹。不要搞混了,这两者跟OLE复合式文件一点关系都没有。</span><span id=Layer21></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>当Microsoft将OLE标签套用到以COM为基础的技术时,OLE Transactions就类似OLE资料库,它的名称来自於历史的遗迹。不要搞混了,这两者跟OLE复合式文件一点关系都没有。</span><span id=Layer22></font></p><hr><p><font size=2 color=#3c3c3c face=arial>使用这些介面,当一个交易开始时,客户端便可以告诉DTC交易管理员,在最後指明欲确认交易或取消交易。DTC交易管理员承担的责任,主要是将这些资讯传送到加入此交易的其它DTC交易管理员,最後再传送到牵涉到此交易实际完成这项工作的软体。</span><span id=Layer23></font></p><br><center><a target=_new href=imagesh/7-1.gif><img border=0 src='imagesl/7-1.gif'></a></center></span><span id=Layer24><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图7-1</span><span id=Layer25> </b></font>DTC交易管理员透过OLE Transactions或标准的XA介面与资源管理员沟通。</span><span id=Layer26></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>从DTC的观点来看,任何参加交易的东西都取得成为资源管理员(resource manager,RM)的资格。RM最常见的范例便是DBMS,如SQL Server或Oracle,不过MSMQ与其它产品也同样能够扮演RM这个角色。实际上在交易确认时,DTC自己并没有真正进行让交易内容永久改变的工作,也没有牵扯到锁定交易资料的动作。资料锁定以及确认工作的工作都是由资源管理者进行的。举例来说,一个资料库将依赖自己内部的交易管理员来确保一连串的变动动作能够完全确认,或者全部复原。同样地,DTC并没有牵涉到通知RM哪些工作是交易的一部份。取代的作法是让客户端将它的要求转送到适当的RM。对一个DBMS来说,客户端通常透过ADO、ODBC或其它资料库存取介面来完成这项工作,而有些RM会自行提供API来处理。DTC的角色纯粹是用来协调交易,确保参加交易的所有RM都知道要做些什麽,以及何时该做事了。</span><span id=Layer27></font></p><p><font size=2 color=#3c3c3c face=arial>一个DBMS,一个讯息伫列系统以及其它能够加入一个交易的东西都具有成为资源管理者的资格</span><span id=Layer28></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个DBMS,一个讯息伫列系统以及其它能够加入一个交易的东西都具有成为资源管理者的资格</span><span id=Layer29></font></p><hr><p><font size=2 color=#3c3c3c face=arial>因为DTC交易管理员要通知许多RM应该做什麽事,所以得存在一些标准的介面以便允许它们进行沟通。Microsoft出产的RM包括SQL Server与MSMQ,为达到这个目的,实作了部份定义在OLE Transactions规格中的介面。如图7-1所示,这些RM能透过OLE Transactions规定的方式与本机的DTC交易管理员沟通。</span><span id=Layer30></font></p><p><font size=2 color=#3c3c3c face=arial>DTC可以与支援OLE Transactions或XA的资源管理者一起运作</span><span id=Layer31></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>DTC可以与支援OLE Transactions或XA的资源管理者一起运作</span><span id=Layer32></font></p><hr><p><font size=2 color=#3c3c3c face=arial>虽然图中并没有表示出来,RM和DTC客户端也可以执行在相同的系统上,允许两者使用同一个DTC交易管理员。</span><span id=Layer33></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>虽然图中并没有表示出来,RM和DTC客户端也可以执行在相同的系统上,允许两者使用同一个DTC交易管理员。</span><span id=Layer34></font></p><hr><p><font size=2 color=#3c3c3c face=arial>然而,其它厂商的RM通常实作另一组介面,就是所谓的XA。它最早是由X/Open协会制定的,目前XA标准是由Open Group掌控(X/Open後继者)。没有实作OLE Transactions的RM能使用XA直接与DTC交易管理员沟通,不管它是执行在Windows 2000或其它作业系统上,如UNIX。运作的详细情形将在本节中描述。</span>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -