📄 207004.htm
字号:
<html><body><span id=Layer1><a name=207004><font color=#3e70d7 face=arial size=5><b>其它主题</span><span id=Layer2></b></font><p><font size=2 color=#3c3c3c face=arial>DTC扮演着分散式交易中多个RM的协调者,提供一个重要且常用的服务。目前还有一些相关的技术并未被广泛地使用,不过仍值得一探究竟。本章最後一节将描述这些技术。</span><span id=Layer3></font></p><font color=#3e72d7 face=arial size=4><b>Transaction Internet Protocol</span><span id=Layer4></b></font><p><font size=2 color=#3c3c3c face=arial>当一个DTC交易管理员与其它DTC交易管理员交谈时,它们使用Microsoft所制定,以DCOM为基础的协定。不过Windows 2000中的DTC交易管理员并不是最常见的选择,世界上还有许多作业系统。最流行的作业系统是IBM的CICS、BEA系统的TUXEDO,以及许多厂商实作的Enterprise JavaBeans (EJB)规格。这些产品都能够自行提供类似DTC使用的协定,意思是说,目前世界上存在着过多的协定。假设某个应用程式,要将对两台或多台电脑之间的动作包装在同一个交易,但并非所有机器都是执行在Microsoft的作业系统之上。其中一个选择是使用了解XA协定,并支援存取软体(如ODBC驱动程式或OLE DB provider)的RM以便与DTC一起运作。假设我们想用的RM本身已加入另一个非DTC的交易管理员掌控的交易。那麽DTC交易管理员如何与非Microsoft的交易管理员沟通呢?</span><span id=Layer5></font></p><p><font size=2 color=#3c3c3c face=arial>虽然身为Windows 2000中部份的标准,DTC并不是今日唯一的分散式交易管理员</span><span id=Layer6></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>虽然身为Windows 2000中部份的标准,DTC并不是今日唯一的分散式交易管理员</span><span id=Layer7></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在Windows 2000平台上,其答案是透过Transaction Internet Protocol (TIP)。TIP目前是停留在IETF的Internet草稿阶段,它定义了一个协定让两个交易管理员相互沟通,无庸烦恼交易管理员是由哪个厂商设计的。Windows 2000版本的DTC支援TIP,并额外增加一些介面到OLE Transactions,以便允许DTC客户端使用这个新的协定。很明显地使用TIP与其它厂商出产的产品沟通时,这些产品需实作这些介面,但依照目前身为IETF创立技术的状态来看,这并不是一件合理且值得期待的事。</span><span id=Layer8></font></p><p><font size=2 color=#3c3c3c face=arial>DTC支援TIP,允许与其它分散式交易管理员协调</span><span id=Layer9></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>DTC支援TIP,允许与其它分散式交易管理员协调</span><span id=Layer10></font></p><hr><p><font size=2 color=#3c3c3c face=arial>图7-5以更高阶的角度来探讨 TIP如何应用在实际面。在图中有两个Microsoft DTC交易管理员如往常一样,使用原生(native)的协定相互沟通。根DTC交易管理员同时使用TIP与一个非Microsoft的交易管理员沟通。</span><span id=Layer11></font></p><p><font size=2 color=#3c3c3c face=arial>TIP允许执行二阶段交付</span><span id=Layer12></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>TIP允许执行二阶段交付</span><span id=Layer13></font></p><hr><br><center><a target=_new href=imagesh/7-5.gif><img border=0 src='imagesl/7-5.gif'></a></center></span><span id=Layer14><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图7-5</span><span id=Layer15> </b></font>TIP允许Microsoft DTC交易管理员与其它厂商的分散式交易管理员沟通。</span><span id=Layer16></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>交易管理员如何互相交谈呢?基本上它们所要做的事不外乎是交换二阶段交付所需的讯息,就如同DTC交易管理员所做的事一样。因为这些讯息是相当简单的,所以TIP是一个非常简单的协定。</span><span id=Layer17></font></p><p><font size=2 color=#3c3c3c face=arial>事实上,整个TIP规格大概只有15页左右。</span><span id=Layer18></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>事实上,整个TIP规格大概只有15页左右。</span><span id=Layer19></font></p><hr><p><font size=2 color=#3c3c3c face=arial>证据如下,图7-6 展示一个典型的TIP交换动作:</span><span id=Layer20></font></p><br><center><a target=_new href=imagesh/7-6.gif><img border=0 src='imagesl/7-6.gif'></a></center></span><span id=Layer21><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图7-6</span><span id=Layer22> </b></font>TIP讯息是用来执行二阶段交付的</span><span id=Layer23></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>如图7-6阐述,TIP讯息大部份以大写的英文字表示,以ASCII传送,这个协定并没有二进位标头的概念。一开始,初始的交易管理员(TIP视为上层的交易管理员) 传送一个IDENTIFY讯息,以及支援哪个版本的TIP资讯。下层的交易管理员便回应一个IDENTIFIED讯息,包含从上层交易管理员提供的版本范围中,选用的TIP版本等讯息。接下来上层交易管理员便传送下层一个PUSH指令,指明它希望开始一个交易(如有必要,TIP同样允许下层使用Pull的方式与上层沟通)这个PUSH指令包含一个可列印的字元字串用来识别交易。下层便以PUSHED指令来回应,其中包含另一个可列印的字元字串来识别交易。如有必要,这些识别码可用来参考到这个交易。举例来说,若在二阶段交付的过程中,RM执行所在的机器故障了,RM最後得询问上层交易管理员以判断是否确认或取消这个交易。这个在PUSH/ PUSHED交换的交易识别码就是用在这个地方的。</span><span id=Layer24></font></p><p><font size=2 color=#3c3c3c face=arial>从这里开始,必要的事便是交换简单,而且标示二阶段交付阶段的自由参数(parameter-free)讯息。若要开始这个程序,上层将传送一个PREPARE讯息到它的下一层,假设所有工作顺利,便回应PREPARED讯息。若下层并没有确认这个交易的意愿,它可能会回传一个ABORTED讯息指明这个事实。假设第一阶段成功了,上层最後将会传送一个COMMIT讯息,下层将会传送一个COMMITTED讯息。虽然有可能使用到其它的传输协定,所有交换的动作基本上都是在TCP连线之上完成的。</span><span id=Layer25></font></p><p><font size=2 color=#3c3c3c face=arial>注意TIP有些东西是未定义的:这个协定并不提供交易真正运作时所传递的资讯。举例来说,假设在Oracle资料库中使用TIP,客户端如何指明资料库中哪些资料应该要改变,这个部份在TIP中并没有定义。取代的作法,TIP只设计来做一件事:当你要确认分散式的交易时,允许不同厂商设计的交易管理员能够一起运作。</span><span id=Layer26></font></p><p><font size=2 color=#3c3c3c face=arial>TIP不会告诉你客户端如何更动RM中的资料</span><span id=Layer27></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>TIP不会告诉你客户端如何更动RM中的资料</span><span id=Layer28></font></p><hr><font color=#3e72d7 face=arial size=4><b>补偿资源管理员</span><span id=Layer29></b></font><p><font size=2 color=#3c3c3c face=arial>思考一下什麽才是建立一个能加入DTC掌控的交易之资源管理者必要的东西。第一,它必须提供某些方法让它的客户端,如中间层的商业物件,来存取并修改它的状态。举例来说,若RM本身是一个DBMS,客户端必须使用ADO以及适当的OLE DB Provider处理它包含的资料。这个RM同样必须要能够参加二阶段交付协定的资料交换要求,以及依赖於这个过程的结果来确认或取消客户端对所管理的资料进行的改变动作,不管任何可能会发生的错误。我们已经描述,进行这个工作的RM会将日志写入硬碟中,然後在发生故障欲进行复原时,或要执行某些功能时读取这些记录。</span><span id=Layer30></font></p><p><font size=2 color=#3c3c3c face=arial>建立一个DTC感知的RM不是易事</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感知的RM不是易事</span><span id=Layer32></font></p><hr><p><font size=2 color=#3c3c3c face=arial>实际上,一个RM需要做的事可能比提供正确的交易行为还要来的多。举例来说,一个DBMS提供锁定的机制以确保牵涉到此交易的资料之隔离性。然而,实作一个DTC感知的RM之核心需求就是一项挑战。假设一家公司建立一个新DBMS,要做这样的事所要花费的努力是预料中的事,因此这家公司可能得雇用专家来建立这类的软体。不过假设你要建立某些可以扮演一个RM与DTC一起运作,而你并不是一个建立这类软体的专家。传统上,你得花费很长的学习曲线,以及面对一些堆积如山的工作。</span><span id=Layer33></font></p><p><font size=2 color=#3c3c3c face=arial>若使用Windows 2000平台,学习曲线与堆积如山的工作可透过补偿交易管理员(Compensating Resource Manager,CRM)。CRM提供一个如何让RM变成DTC感知的标准实作方式。当RM不能为你做事情时,它可以让你的工作变得简单些。举例来说,假设你正要建立一个能够储存、修改资料的应用程式,但是因为应用程式的复杂性或成本,或其它问题,你不想使用DBMS来管理这些资讯。取代的作法,假设你选择自行建立自己的RM,将资料储存在Windows 2000档案系统中的一般档案上。你的应用程式可能仍需要全部成功或全部失败(all-or-nothing)的行为,因此你的RM需加入DTC掌控的交易之中。不过目前Windows 2000一般的档案中还不能使用这些特性。因为RM是自行撰写的,你可以提升这项能力,让你的RM是DTC感知的。透过在某些程式码中提供一个标准的实作,则建立自己的CRM时将会很有用。还有一些事要做,CRM并不会为你做完所有的事,不过它确实让工作变得容易些。</span><span id=Layer34></font></p><p><font size=2 color=#3c3c3c face=arial>CRM提供DTC感知的RM之主要实作部份</span><span id=Layer35></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CRM提供DTC感知的RM之主要实作部份</span><span id=Layer36></font></p><hr><p><font size=2 color=#3c3c3c face=arial>使用CRM建立一个DTC感知的RM必须建立两个不同的元件。第一个元件,称为CRM Worker,执行应用程式必要的工作,在必要时建立日志记录。另一个元件就是所谓的CRM Compensator,用在交易结束时。它可以读取CRM Worker建立的日记录,然後使用日志中的资讯,与其它的资讯正确地确认或取消交易。</span><span id=Layer37></font></p><p><font size=2 color=#3c3c3c face=arial>使用CRM需要实作一个CRM Worker与一个CRM Compensator</span><span id=Layer38></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>使用CRM需要实作一个CRM Worker与一个CRM Compensator</span><span id=Layer39></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在交易处理应用程式,有时必须执行一个补偿式的交易以还原前一个已被确认的交易之结果。仅管在名称上很类似,不过补偿资源管理员与补偿式交易一点关系也没有。</span><span id=Layer40></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=Layer41></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在这个范例中,客户端直接使用DTC,虽然说常见的情况是客户端透过COM runtime间接的存取DTC。(实际上,CRM有时会被视为COM+服务的一部份,不过它可以用在COM+服务以及非COM+服务的环境中。) 图7-7的步骤一中,一开始,客户端要求DTC开始一个新交易。接下来在步骤二,客户端为这个RM建立CRM Worker。一旦Worker存在後,Worker会建立CRM Clerk的实例, 如步骤叁。CRM Clerk是Windows 2000平台上提供的标准元件,接下来Worker向此Clerk注册一个适当的CRM Compensator。CRM Clerk便将这个RM加入交易之中,如步骤四,而此时CRM Worker已准备好接收此交易进行的工作要求。</span><span id=Layer42></font></p><p><font size=2 color=#3c3c3c face=arial>接下来,在图7-8步骤五展示了客户端更新受RM管理的资讯。这个范例假设使用了两个RM:SQL Server与使用CRM建立的一个RM。虽然图中并没有展示这一点,若要存取SQL Server,客户端可能会使用ADO。若要存取以CRM为基础的RM,物件便使用CRM Worker实作者所提供的任何介面。就图中所建议,它很可能是一个COM介面,不过这并不是必要的。</span><span id=Layer43></font></p><br><center><a target=_new href=imagesh/7-7.gif><img border=0 src='imagesl/7-7.gif'></a></center></span><span id=Layer44><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图7-7</span><span id=Layer45> </b></font>客户端建立一个CRM Worker,然後建立一个CRM Clerk。</span><span id=Layer46></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>不管这些要求是如何产生的,CRM Worker必须负责完成这些要求。你必须实作这个元件,它并非自动提供的,因此它的能力是视这个RM想做的事而决定的。大部份的RM用来更改某些资料的状态(这些资料可能储存在档案或其它地方),以因应它们的客户端发出的要求。当变动资料的交易部份结束时,RM必须确认这些变动,或者将状态回存成原来的值。更进一步来说,它必须正确地处理这些事情,不管软体错误或硬体失败的情况发生。之前已讨论过,一般说来,RM是依赖日志以便完成这个工作。</span><span id=Layer47></font></p><p><font size=2 color=#3c3c3c face=arial>CRM Worker更改RM的状态并将变动的部份写到日志</span><span id=Layer48></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CRM Worker更改RM的状态并将变动的部份写到日志</span><span id=Layer49></font></p><hr><p><font size=2 color=#3c3c3c face=arial>实作一个可信赖、正确的日志是很重要的。很幸运地,CRM Clerk提供一个能让任一个CRM Worker使用的日志。为了回应客户端发出的要求,CRM Worker可以记录它企图更改的资料之状态,如图7-8的步骤六,然後真正进行变动,如步骤七。写入日志记录(称先写入的日志)首先让复原的动作变为可能,即使在状态改变之前已发生了错误。Worker透过CRM Clerk提供的ICrmLogControl介面存取日志。</span><span id=Layer50></font></p><br><center><a target=_new href=imagesh/7-8.gif><img border=0 src='imagesl/7-8.gif'></a></center></span><span id=Layer51><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图7-8</span><span id=Layer52> </b></font>当客户端修改RM管理的资料,RM在进行变动之前先将变动部份写到日志。</span><span id=Layer53></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>当客户端告诉DTC结束一个交易,如图7-9的步骤八,DTC与SQL Server,以CRM为基础的CRM沟通以进行二阶段交付,如步骤九。CRM Clerk接收DTC的要求,然後为这个交易建立一个适当的CRM Compensator(回顾一下CRM Worker告诉CRM Clerk在Worker建立时要使用哪一个Compensator。) Compensator便进行确认交易或取消交易该做的事,如步骤十一,它可以修改资料并存取CRM Worker建立的日志以便正确地完成这项工作。</span><span id=Layer54></font></p><p><font size=2 color=#3c3c3c face=arial>CRM Comp-ensator处理交易的确认或取消工作</span><span id=Layer55></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CRM Comp-ensator处理交易的确认或取消工作</span><span id=Layer56></font></p><hr><br><center><a target=_new href=imagesh/7-9.gif><img border=0 src='imagesl/7-9.gif'></a></center></span><span id=Layer57><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图7-9</span><span id=Layer58> </b></font>当交易结束时,CRM Compensator与CRM Clerk一起运作以便让RM能正确地加入二阶段交付作业。</span><span id=Layer59></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>CRM并不会让建立RM的工作变得简单,你仍需撰写一些程式码来修改资料,并处理交易的结果。不过CRM确实让这个动作变得更容易。CRM同时提供标准的日志,以及支援DTC的标准二阶段交付讯息,它允许RM开发者专注在这个RM诉求的特定问题上。不管存取资料的动作是否为交易的一部份,存取资料是建立今日应用程式很基本的功能。大部份为Windows 2000撰写的应用程式向来都是使用ADO来存取资料。若这些应用程式同样需要更改多个资源管理者的资料,并将这些动作包装在交易之中,它们也可能利用到DTC。然而,虽然说ADO可直接让许多应用程式使用,但DTC却不行。要得到在叁层式应用程式中,应用程式为何最常使用到这个服务的完整概念,需要了解现在被定义为COM+一部份的技术,这也就是</span><span id=Layer60> <a target='_new' href=208.htm#>下一章</span><span id=Layer61></a> 的主题。</span><span id=Layer62></font></p><p><font size=2 color=#3c3c3c face=arial>DTC最常使用在为Windows 2000所建立的叁层式应用程式</span><span id=Layer63></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>DTC最常使用在为Windows 2000所建立的叁层式应用程式</span>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -