📄 207003.htm
字号:
<html><body><span id=Layer1><a name=207003><font color=#3e70d7 face=arial size=5><b>一个DTC范例</span><span id=Layer2></b></font><p><font size=2 color=#3c3c3c face=arial>想像一下,在Windows 2000作业系统的客户端正要从维护在另一台Windows 2000平台上的SQL Server资料库中的存款帐户进行转帐的动作,将金钱转入执行在UNIX系统下的Oracle资料库中。DTC实际上是怎麽让这个分散式的交易完成的?</span><span id=Layer3></font></p><p><font size=2 color=#3c3c3c face=arial>图7-2 显示第一个步骤。一开始DTC客户端使用OLE Transactions来告诉它本机的DTC交易管理员开始一个交易(记得</span><span id=Layer4> <a target='_new' href=208.htm#>下一章</span><span id=Layer5></a> 将描述,这一个客户端通常是COM runtime,而不是使用者自行撰写的应用程式)。一旦这个工作完成,客户端便发出一个SQL语法查询到SQL Server资料库要求从目地的存款帐户减去适当的金额。客户端使用来进行这个工作的API和ADO非常类似,不过它所进行的呼叫最後得依赖一个OLE DB provider或一个ODBC驱动程式。在发行这个查询之前,客户端可以呼叫适当的函数(如ODBC的SQLSetConnectOption),传入特定DTC交易的识别码,通知资料库驱动程式:DTC控制的交易正在进行中。当客户端真正发行查询时,这些资讯便和这个查询一起传送到资料库(也就是RM)。一旦RM接收到这个要求,它便呼叫适当的OLE Transactions method与本机的DTC交易管理员沟通,然後加入交易之中(说句行话,RM enlist in the transaction)。</span><span id=Layer6></font></p><p><font size=2 color=#3c3c3c face=arial>DTC客户端开始一个交易,然後发行此交易的第一个查询</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>DTC客户端开始一个交易,然後发行此交易的第一个查询</span><span id=Layer8></font></p><hr><br><center><a target=_new href=imagesh/7-2.gif><img border=0 src='imagesl/7-2.gif'></a></center></span><span id=Layer9><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图<font style='background-color:#ffff99'></span><span id=Layer10><font style='background-color:#ffff99'>Server</span><span id=Layer11></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>接下来DTC客户端发行交易中第二个查询</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>接下来DTC客户端发行交易中第二个查询</span><span id=Layer13></font></p><hr><p><font size=2 color=#3c3c3c face=arial>接下来,假设客户端在同一个DTC交易中,发行第二个SQL查询,此时便新增金额到UNIX系统上Oracle资料库中的支票帐户。运作的过程如图7-3。跟往常一般,客户端发行一个查询到资料库驱动程式。因为Oracle执行在UNIX之上,因此DTC交易管理员目前并不存在於远端的机器之上。也因为Oracle支援XA而非OLE Transactions,所以资料库驱动程式须负更大的责任。一如往常,你必须告诉驱动程式这个更新的要求将在既有的DTC交易中完成。然而,现在资料库驱动程式必须呼叫位於本机DTC交易管理员上OLE Transactions的method,自行加入交易之中。一旦这个工作完成,资料库驱动程式便使用与XA标准一致的方法,将SQL查询与交易识别码传送到Oracle。</span><span id=Layer14></font></p><br><center><a target=_new href=imagesh/7-3.gif><img border=0 src='imagesl/7-3.gif'></a></center></span><span id=Layer15><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图7-3</span><span id=Layer16> </b></font>客户端接着发行一个更新的操作到Oracle。</span><span id=Layer17></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>注意加入一个DTC交易,下面两件事的其中一个一定为True。其中一项可能是RM执行在Microsoft作业系统,且实作OLE Transactions,如SQL Server。另一种可能是用来存取RM的驱动程式必须要能够使用OLE Transactions将RM加入一个DTC交易之中,而RM本身必须支援XA,如Oracle与其它的DBMS。重点是要加入DTC协调运作的交易,RM或其它存取它们的软体必须在某些方面是属於DTC感知的(DTC-aware)。</span><span id=Layer18></font></p><p><font size=2 color=#3c3c3c face=arial>当客户端决定要结束这个交易,它会再次呼叫适当的OLE Transactions method来完成,如图7-4所示。这个要求指明了交易是否该确认或取消。(当交易中任何的参加者允许取消时,只有初始化此交易的客户端才有确认这个交易的权力。)在接收到这个要求之後,本机的DTC交易管理员立即致力於与所有加入这个交易中的RM进行二阶段交付协商工作。对於执行於Windows 2000平台上,并实作了OLE Transactions的SQL Server来说,根DTC交易管理员传送它的要求到与SQL Server所在的同一台机器之DTC交易管理员,然後依次将这些要求传送到DBMS。从SQL Server发出的回应则透过相同的路径回传。然而对Oracle来说,(支援XA协定,执行在UNIX系统之上,没有本机的DTC交易管理员)客户端的DTC交易管理员发出请求到客户端机器上的Oracle驱动程式,然後这个驱动程式将使用与XA一致的方式,将交易管理者的要求导向远端系统上的Oracle,执行的结果也会以相同的方法传回。</span><span id=Layer19></font></p><p><font size=2 color=#3c3c3c face=arial>DTC客户端结束这个交易,同时DTC确保所有的RM都做同样的事:确认或取消</span><span id=Layer20></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>DTC客户端结束这个交易,同时DTC确保所有的RM都做同样的事:确认或取消</span><span id=Layer21></font></p><hr><p><font size=2 color=#3c3c3c face=arial>先不管这些机制,客户端的DTC交易管理员负责的。它扮演的角色是这个交易树的根,传送第一阶段的准备(Prepare)讯息,然後传送最後的确认(Commit)或取消(Abort)讯息。虽然图7-4并没有显示这一段,但如同前文所述,每个DTC交易管理员维护一个日志档案,以便在发生系统故障或网路问题时能够进行复原的动作。最後一点值得一提,DTC并不支援巢状交易(nested transaction)。举例来说,DTC客户端不可能开始一个交易後,然後在第一个交易中再开始另一个交易。取代的作法,DTC只允许一个平顺的交易,因此企图在一个交易之中再开始一个交易是不被允许的。</span><span id=Layer22></font></p><br><center><a target=_new href=imagesh/7-4.gif><img border=0 src='imagesl/7-4.gif'></a></center></span><span id=Layer23><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图7-4</span><span id=Layer24> </b></font>当客户端结束交易时,DTC交易管理员与参加此交易的RM执行二阶段交付协定。</span>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -