⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 208003.htm

📁 探索Windows 2000发展策略以及中介层技术设计的基本概念
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<html><body><span  id=Layer1><a name=208003><font color=#3e70d7 face=arial size=5><b>自动交易处理</span><span  id=Layer2></b></font><p><font size=2 color=#3c3c3c face=arial>如</span><span  id=Layer3>&nbsp;<a target='_new' href=207.htm#>前章</span><span  id=Layer4></a>&nbsp;所描述,交易的all-or-nothing行为通常需要实践一个商业程序。当在一个DBMS中无法使用ADO控制交易时,或者无法直接使用DTC管理分散式交易时,COM+提供其它的解决方案,使其更容易、更适用在叁层式应用程式上∶自动交易处理。在背後,COM_自动交易处理依赖於DTC,若牵涉到DBMS,则也得依赖DBMS交易管理员(transaction manager) 的功能。不过自动交易处理比起这些解决方案的任一种,提供了更多重要的优点。</span><span  id=Layer5></font></p><br><center><a target=_new href=imagesh/8-5.gif><img border=0 src='imagesl/8-5.gif'></a></center></span><span  id=Layer6><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图8-5</span><span  id=Layer7>&nbsp;</b></font>物件可以呼叫CoGetObjectContext,以便获得指向它的ObjectContext之IObjectContext介面指标。</span><span  id=Layer8></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>首先,自动交易处理很容易使用。一旦应用程式的设计师与程式开发者了解它们如何运作时,建立使用自动交易处理的元件便非常容易了。第二,从独立的元件使用自动交易处理时,运作的过程相当良好。他们允许你在部署单一的元件时可以以不同的方式进行,也允许部署到不同的应用程式,然後仍旧可以得到自己要求的交易行为。程式设计师可以建立一个交易性元件,只做一件事,且可以做得很好,然後可能在许多的情况中使用之。重复使用商业逻辑本来就是一件相当困难的事,而COM+提供的自动交易处理则扫除障碍,直达成功大门。</span><span  id=Layer9></font></p><p><font size=2 color=#3c3c3c face=arial>自动交易处理相当简单且容易使用</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>自动交易处理相当简单且容易使用</span><span  id=Layer11></font></p><hr><font color=#3e72d7 face=arial size=4><b>自动交易处理运作的情形</span><span  id=Layer12></b></font><p><font size=2 color=#3c3c3c face=arial>若要了解自动交易处理运作的情形,回想</span><span  id=Layer13>&nbsp;<a target='_new' href=207.htm#>前章</span><span  id=Layer14></a>&nbsp;介绍的DTC范例。在这个范例中,一个DTC客户端从储存在SQL Server资料库的存款帐号进行转帐,将帐款转到储存到Oracle资料库的支票户头。透过DTC确保两方的更新动作都会成功地执行,或都不执行。透过COM+,程式设计师能够完成同样的动作,而甚至不需察觉DTC的存在。取代的方式是,COM物件的建立者可以实作一个method,假设称为MoveMoney,这个method接受叁个参数∶Source,是欲扣款的银行帐户;Target,是欲存入的银行帐户;以及Amount,是欲转帐的金额。这个物件的客户端便可呼叫MoveMoney method,传入适当的值,进行转帐的动作。透过这几个简单的动作,method的实作者可以使用COM+的自动交易处理机制来确保两个查询都能成功,或同时失败。</span><span  id=Layer15></font></p><p><font size=2 color=#3c3c3c face=arial>自动交易处理让程式设计师不用面对DTC</span><span  id=Layer16></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=Layer17></font></p><hr><p><font size=2 color=#3c3c3c face=arial>图8-6显示程序中的第一个步骤。在第一个步骤中,客户端呼叫MoveMoney method。(图中建议客户端是一个远端的系统,透过DCOM进行呼叫,不过客户端最好是一个ASP网页,执行在和实作这个method的COM物件所在的同一台电脑上。)因为被呼叫的物件设定为使用自动交易处理机制,这个method call将会被COM runtime拦截,如步骤二所示,runtime检视物件的context资讯以便判断是否要开启一个新交易。(元件如何进行组态设定的动作将会简短地说明。)在这个范例中,物件确实需要交易处理机制,因此COM runtime使用OLE Transactions告知DTC开始一个新交易。</span><span  id=Layer18></font></p><p><font size=2 color=#3c3c3c face=arial>当呼叫物件的一个method时,C O M runtime能自动开始一个新交易</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>当呼叫物件的一个method时,C O M runtime能自动开始一个新交易</span><span  id=Layer20></font></p><hr><p><font size=2 color=#3c3c3c face=arial>这个动作有点简单化的意味。事实上,COM runtime延迟交易的进行,直到它确认物件确实需要交易,如物件发行一个资料库查询时。</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>这个动作有点简单化的意味。事实上,COM runtime延迟交易的进行,直到它确认物件确实需要交易,如物件发行一个资料库查询时。</span><span  id=Layer22></font></p><hr><p><font size=2 color=#3c3c3c face=arial>然後COM runtime允许method call继续执行,并呼叫COM物件的程式设计师实作出来的MoveMoney。这个method开始执行,如图步骤叁所示,接着发行第一个SQL查询,指示SQL Server减去特定存款帐户的金额。就如同</span><span  id=Layer23>&nbsp;<a target='_new' href=207.htm#>前章</span><span  id=Layer24></a>&nbsp;讨论的DTC一样,SQL Server将会加入活动中的DTC交易之中,然後执行这个查询,如步骤四所示。</span><span  id=Layer25></font></p><p><font size=2 color=#3c3c3c face=arial>资源管理者会自动加入交易之中</span><span  id=Layer26></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=Layer27></font></p><hr><p><font size=2 color=#3c3c3c face=arial>为要让这些图尽可能清楚些,我省略一些DTC的细节。然而,了解DTC之交互作用恰如</span><span  id=Layer28>&nbsp;<a target='_new' href=207.htm#>前章</span><span  id=Layer29></a>&nbsp;所述。同样地,虽然在这个范例中使用OLE DB provider存取DBMS,COM物件最常用的介面还是ADO。</span><span  id=Layer30></font></p><a name="8-6"></span><span  id=Layer31><br><center><a target=_new href=imagesh/8-6.gif><img border=0 src='imagesl/8-6.gif'></a></center></span><span  id=Layer32><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图8-6</span><span  id=Layer33>&nbsp;</b></font>客户端的method call会导致COM runtime开始一个交易,然後发行第一个查询,并将SQL Server加入这个交易中。</span><span  id=Layer34></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>接下来如图8-7的步骤五所示,COM物件中的MoveMoney method发行它的第二个SQL查询,这次把目标放在Oracle资料库上,指定欲新增到支票帐户的金额。再次强调资料库将会加入交易之中,如步骤六所示,然後执行查询。</span><span  id=Layer35></font></p><p><font size=2 color=#3c3c3c face=arial>一旦两个查询皆执行後,MoveMoney method可以通知COM runtime已完成工作了。有两种可能的结果:全部成功执行,因此method希望能够确认交易中所有的工作;或者是某些动作执行失败,这表示method希望能够复原交易中所有的动作。(举例来说,或许帐户中并没有足够的金额可供扣款以满足这个需求,或者因为网路故障,而使得对Oracle资料库发出的要求不能成功执行。 )在任一种情况下,MoveMoney可呼叫IObjectContext的method,以通知COM runtime所希望的结果。如图8-8中的步骤七所示。若它希望确认这个交易,则呼叫IObjectContext::SetComplete,若希望取消这个交易则呼叫IObjectContext::SetAbort。</span><span  id=Layer36></font></p><p><font size=2 color=#3c3c3c face=arial>当它的工作完成後,一个交易性物件可以呼叫SetCom-plete或者是SetAbort</span><span  id=Layer37></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>当它的工作完成後,一个交易性物件可以呼叫SetCom-plete或者是SetAbort</span><span  id=Layer38></font></p><hr><p><font size=2 color=#3c3c3c face=arial>如步骤八所示,COM runtime适当地回应。若物件呼叫SetComplete,则使用OLE Transactions通知DTC确认这个交易,OLE Transactions,而SetAbort则会告诉DTC取消这个交易。(注意这是一个简单的范例,交易中只包含一个单一的物件。当交易中包含多个元件时,就变得复杂多了。)在步骤九,DTC使用二阶段交付(two-phase commit)实行了COM runtime的要求,如</span><span  id=Layer39>&nbsp;<a target='_new' href=207.htm#>前章</span><span  id=Layer40></a>&nbsp;所描述的一样。</span><span  id=Layer41></font></p><p><font size=2 color=#3c3c3c face=arial>COM runtime 告诉DTC确认一个交易或取消一个交易</span><span  id=Layer42></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>COM runtime 告诉DTC确认一个交易或取消一个交易</span><span  id=Layer43></font></p><hr><br><center><a target=_new href=imagesh/8-7.gif><img border=0 src='imagesl/8-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>&nbsp;图8-7</span><span  id=Layer45>&nbsp;</b></font>发行第二个查循将Oracle加入这个交易中。</span><span  id=Layer46></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>最後,一旦所有的动作完成,同时交易结束後,MoveMoney method便回到它的呼叫者,如步骤十所示。呼叫者完全没有察觉它的复杂性,它只知道要求一个COM物件进行转帐的动作。实际上牵涉到交易的动作,呼叫者不会直接看到。</span><span  id=Layer47></font></p><a name="8-8"></span><span  id=Layer48><br><center><a target=_new href=imagesh/8-8.gif><img border=0 src='imagesl/8-8.gif'></a></center></span><span  id=Layer49><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图8-8</span><span  id=Layer50>&nbsp;</b></font>为了结束交易,MoveMoney method呼叫SetComplete或SetAbort,而COM runtime将会与DTC一起运作以完成这个要求。</span><span  id=Layer51></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>为了协助你对这个范例的动作拥有较清楚的概念图,以下是一个简单的虚拟码,描述MoveMoney method所做的事:</span><span  id=Layer52></font></p><div style="background-color: #D7D7D7;"><font face=Arial size=3><pre>MoveMoney(Source,Target,Amount)   对SQL Sverver发行一个SQL查询,从资料来源减去金额(Amount)   对Oracle发行一个SQL查询,将Amount加到Target   呼叫GetObjectContext

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -