Welcome

首页 / 软件开发 / .NET编程技术 / 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]

谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]2011-08-20 博客园 Artech[续上篇] 当基于LTM或者KTM的事务提升到基于DTC的分布式事务后,DTC成为了本机所有事务型资源 管理器的管理者;此外,当一个事务型操作超出了本机的范围,出现了跨机器的调用后,本机的DTC需要 于被调用者所在机器的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调用并被纳入当前事 务的时候,会向本机DTC进行事务登记。

当上面所述的事务登记流程结束后,参与整个分布式事务的DTC和资源管理器形成了如图2所示的树形 层次结构,由于该结构的构建主要是为了后面对整个事务的提交服务的,所以我们一般将其称为事务提 交树(Transaction Commit Tree)。事务提交树的根为事务初始化服务所在机器的DTC,在整个事务提 交过程中,它是总的协调者,又被称为全局提交协调器(GCC:Global Commit Coordinator )。资源管 理器充当事务提交树的叶子节点,它们的父节点为本机的DTC。分布于不同机器的DTC按照事务传播的路 径形成上下级关系。

图2 事务提交树

事务提交树的构建使得对分布式事务的提交成为可能,分布式事务的提交采用两阶段协议实现,接下 来我们详细介绍基于两阶段提交协议的事务提交机制。