快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳门新葡亰925588aapp:谈谈分布式事务之二:基于DTC的分布式事务管理模型下篇



[续上篇] 当基于LTM或者KTM的事务提升到基于DTC的散播式事务后,DTC成为了本机所有事务型资本治理器的治理者;此外,当一个事务型操作越过了本机的范围,呈现了跨机械的调用后,本机的DTC必澳门新葡亰925588aapp要于被调用者所在机械的DTC进行帮忙。上级对下级(包括本机DTC对本机所有资本治理器,以及高低级DTC)的治理得条件是下级在上级那里挂号,即事务挂号(Transaction Enlist)。所有事务介入者,包括所有资本治理器和事务治理器(即DTC)在进行了事务等级完成之后形成了一个树形的层级布局,该布局的形成是后续的事务供给成为可能,是以我们将其称之为事务提交树(Transaction Commit Tree)。

一、事务挂号(Transaction Enlisting)和事务提交树(Transaction Commit Tree)

事务挂号的目的在于建立举事务介入者(只要指资本治理器和事务治理器DTC)之间的关系,匆匆进互相之间的协作。我们先来看看全部事务挂号是若何进行的,全部事务挂号流程大年夜致如图1所示。

图1 事务挂号的流程

图1所示的事务涉及到支配与两台机械(Machine A和Machine B)上两个办事之间的交互,事务由Service初始化,在调用Service2的时刻被传播到Machine B,从而将散播于两台机械的资本治理器纳入到同一个事务之中。接下来,我们对全部流程进行具体先容。

首先,Service A开始一个新的事务,并将其最为当前履行高低文的情况事务(Ambient Transaction)。当Service A调用本机的资本治理器的时刻,会将该资本治理器纳入到本事务之中(对付我们后续要先容的System.Transactions事务,像SQL Server、Oracle以及MSMQ等资本治理器都能够自动感知到当前的情况事务)。此时,资本治理器(RM)向本机的DTC进行事务挂号,从此 DTC和资本治理器之间建立起了高低级关系。

当Service A在调用Service B的时刻,会将当前事务的一些信息,比如散播式事务的ID以及关于本机DTC相关信息,封装在消息中(一样平常是SOAP报头)向对方通报。当Service B吸收到办事调用哀求消息,会将事务相关的信息提掏出来在本地重修事务,并将其作为当前的情况事务,该事务和原事务具有相同的ID。同时,根据获得的关于 Machine A的DTC相关信息,让本机的DTC对Machine A的DTC进行事务挂号,进而使两台机械的DTC确立了高低级关系。

和Service A造访本机的资本治理器一样,Machine B的资本治理器被Service B调用并被纳入当前事务的时刻,澳门新葡亰925588aapp会向本机DTC进行事务挂号。

当上面所述的事务挂号流程停止后,介入全部散播式事务的DTC和资本治理器形成了如图2所示的树形层次布局,因为该布局的构建主如果为了后面对全部事务的提交办事的,以是我们一样平常将其称为事务提交树(Transaction Commit Tree)。事务提交树的根为事务初始化办事所在机械的DTC,在全部事务提交历程中,它是总的和谐者,又被称为全局提交和谐器(GCC:Global Commit Coordinator )。资本治理器充当事务提交树的叶子节点,它们的父节点为本机的澳门新葡亰925588aappDTC。散播于不合机械的DTC按照事务传播的路径形成高低级关系。

图2 事务提交树

事务提交树的构建使得对散播式事务的提交成为可能,散播式事务的提交采纳两阶段协议实现,接下来我们具体先容基于两阶段提交协议的事务提交机制。

二、基于两阶段提交(2PC:Two-Phase Commit)协议的事务提交机制

不合于基于单一资本治理器的本地事务,在一个散播式情况中时实现一个涉及到多个资本治理器的散播式事务,实现事务的ACID四大年夜属性,要麻烦得多。当事务初始化办事(利用或者组件,为了更佳切近WCF,我们都称办事)完成所有相关的操作,抉择提交该事务。对付散播式事务的提交,终极的结果有两个:假如所有的操作能够顺利完成,必要持久化的数据被响应的资本治理器写入到目标资本;假如任何一个环节掉败,所有持久化资本治理器将数据规复到原本的状态。散播式事务的全部提交历程,采纳两阶段提交(2PC:Two-Phase)Commit协议完成。顾名思义,“两阶段提交”意味全部全部事务提交阶段分两个阶段,我们现在就来具体先容分手在这两个阶段中,都在做些什么。

注:在事务初始化办事抉择提交事务之前,任何一个介入者均可以中止(Abort)该事务,任何一个介入者对事务的中止都将导致全部散播式事务的回滚。

1、第一阶段(Phase I):筹备(Prepare)阶段

在第一个阶段,作为根节点的DTC沿着事务提交树的路径,向所有事务的介入者提议哀求,要求它们对本地事务的结果进行投票。被哀求的介入者将本地事务结果返回给自己的上级,对付资本治理器,自己的上级便是本机的DTC;假如自己本身便是DTC,那么自己得上级便是位于事务提交树父节点的DTC。根据详细事务操作履行的环境,介入者投票的类型包括如下三种:

就绪(Prepared):介入者批准对事务的提交,并允诺在接管到真正的提交哀求后完成本地的提交义务;

只读(Read-only):介入者批准对事务的提交,然则不盼望接管真正的事务提交哀求;

中止澳门新葡亰925588aapp(Aborted):介入者要求中止事务。

对付一个非根节点DTC来说,当它从父节点接管到标准的“筹备”哀求后,会急速将该哀求沿着事务提交树发送给自己的下级(本机的资本治理器和下级DTC),然后根据从下级接管的所有投票结果,谋略出自己投票的结果。详细的算法是:假如所有的投票结果都是“就绪”和“只读”,对应的结果是“提交”,反之,假如任何一个投票结果是“中止”,则终极的结果便是“中止”,换句话说,任何一个事务介入者具有一票反对权着末。着末,DTC将谋略出来的投票结果反馈给自己的上级。

当根节点DTC接管到附属于自己的所有资本治理器和下级DTC的投票结果后,采纳于上面一样的算法抉择全部散播式事务的最遣散果。当根节点DTC抉择了事务终极的结果后,全部提交历程进入第二阶段。

注:我们可以设置事务的超不时限,假如根节点DTC在该时限内没有先容到所有介入者的投票哀求,会对全部散播式事务做出回滚的抉择。

2、第二阶段(Phase II):提交(Commit)或中止(Abort)

作为事务提交树根节点的DTC根据终极的事务结果,对全部事务进行终极的提交或者中止操作。同样是沿着事务提交树的路径,提交或者中止哀求被广播出去。响应的资本治理器根据从本机DTC得到的哀求,实施终极的提交或者规复操作。当事务介入者完成了各自就的义务后,类似于第一个阶段的投票,会讲履行的结果沿着事务提交树逆向回馈给作为根节点的DTC。

根节点DTC只有接管到所有事务介入者的基于各自事务处置惩罚的回覆,才能确保全部事务被成功提交或者回滚。那么假如事务的介入者完成了第一阶段的投票,收集断开,那将若何呢?这就涉及到对未决(In-Doubt)事务的处置惩罚。

3、未决(In-Doubt)事务的处置惩罚

对付某个散播式事务的介入者(DTC或者资本治理器)来说,在第一阶段向上级(事务提交树的父节点)投票注解提交就绪(Prepared)之后,直到它接管到根节点DTC终极的提交或者回滚的哀求,它并不知晓本地事务的结果。在这时代,假如呈现当机并重启,本地的事务处于一种“未决(In-Doubt)”状态。未决事务仅仅呈现在非根节点DTC所在的机械。散播式事务采纳如下的机制处置惩罚未决事务。

当重启后,对付本机的所有未决事务,DTC会向上级DTC发送查询哀求,获取每一个事务终极的结果(提交照样中止)。假如上级也不能抉择事务的结果,那么哀求会沿着事务提交树赓续向上(沿着根的偏向)发送,直到获得一个明确的回复(不管如何,位于根节点的全局提交和谐器老是清楚事务的结果的)。

此外,当下级DTC向自己发送相同的查询哀求的时刻,该DTC会讲获取到的结果回覆给它们。假如未决事务存在的光阴太长,系统治理者可以强制提交或澳门新葡亰925588aapp者中止该事务。

4、单阶段提交(SPC: Single-Phase Commit)优化

对付事务最遣散果(提交或者中止)的决策者来说,假如它具有了不止一个下级,那么采纳基于投票机制的两阶段提交协议独一选择。然则假如仅仅具有一个独一的下级呢,这种投票机制就没有需要了。在这种环境下,根节点DTC采纳一种优化的协议来完成全部事务的提交,我们称之为单阶段提交(SPC:Single- Phase Commit)。

顾名思义,2PC意味着全部事务提交分成两个阶段,SPC则表示将其所短为一个阶段。全部流程很简单,假如根节点DTC仅仅只有一个挂号的事务介入者(本机资本治理器或者下级DTC),而不管这个下级自身具有几个下级,它不会像2PC一样先向下级发送“筹备”哀求,而是直接发送提交哀求,我们将这个哀求成为单阶段提交(SPC)哀求。接管到SPC哀求的介入者,假如是资本治理器,则直接提交本地事务,并将最遣散果(成功提交或者掉败中止)反馈给这个跟节点DTC。

假如SPC哀求的接管者是DTC,那么会根据附属于自己的下级的数量选择响应的提交策略。详细做法和根节点DTC提交策略的选摘要领一样:假如自己具有独逐一个下级,则采纳SPC,反之采纳2PC。

也便是说,不仅仅是根节点DTC可以选择SPC提交事务,任何具有单一下级的DTC均可以采纳SPC。然则,非根节点DTC只有在接管到SPC哀求的环境下,才能选择经由过程SPC提交事务。如图3给出了两颗事务提交树(图中轻忽掉落资本治理器,每个节点代表DTC),对付左边的树,由于根节点A和下级B均只有一个独一的下级,以是A和B均采纳 SPC,C具有两个下级,则采纳2PC。而对付右边的树,由于根节点本身具有两个下级,抉择了所有的节点均采纳2PC,纵然是对付只有一个下级的B和C。

图3 DTC对SPC和2PC的选择

我们我们先容全部Windows平台基于DTC的散播式事务治理模型,接下来的一篇中,我将会具体先容基于System.Transactions事务的编程。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: