Distributed Transactions
分布式事务
企业服务支持分布式事务,这些事务可以贯穿于多个数据库系统,并且这些数据库系统可以是不同公司的产品。
分布式事务需要三样东西:资源管理器、事务管理器和一个2PC协议。
(译注:2PC是two-phase commit的缩写,以往有的书上翻译为“二阶段提交”,但这并不准确。翻译成“二阶段完成”或者“二阶完成”都要好一点,现在暂时使用2PC,以后再确定)
资源管理器,顾名思义是用来管理资源的。资源的例子有数据库,消息队列,或者简单的文件等。SQL Server是一个资源管理器,Oracle数据库也是,消息队列服务器也是。资源管理器必须支持2PC协议。
2PC由准备阶段和确认阶段组成。在更新数据时,先有一个准备阶段,在此期间事务内所有参与者必须同意操作的成功完成。如果其中有一个参与者中止了事务,那么其他参与者就执行回滚操作。在准备阶段表明成功,数据库必须保证事务在系统当机后仍然可以
完成。如果事务的所有参与者都成功通过了准备阶段,那么确认阶段就开始,在这个阶段内所有的数据都储存到数据库中。
一个分布式事务必须由一个事务管理器来协调。对于企业服务来说,分布式事务协调器(Distributed Transaction Coordinator,DTC)就是这样的一个事务管理器。DTC支持X/Open的XA分布式事务规范和OLE事务协议。DTC本身并不直接使用X/Open XA协议,该协议必须由ODBC驱动程序或者OLE DB提供程序转换为OLE事务。微软的SQL Server支持X/Open XA规范, Oracle也支持。DTC作为Windows操作系统的一部分,是一个服务进程。
分布式事务协调器管理着多个数据库的事务和来自多个客户端的连接。为了在单个事务里协调分布在多个系统的操作,不同系统的DTC需要相互通信。需要参与分布式事务的资源管理器上的连接,必须与DTC注册。为了注册这些数据库连接,ADO.NET的SQL Server和OLE DB数据提供程序知道如何与DTC打交道。假如在服务组件里使用事务属性的话,操作里的数据库连接会自动与DTC注册。
图7-1展示了一个事务贯穿于多个系统的情况。这个事务从运行在服务器A上的组件A开始。组件A和服务器C上的数据库间有一个数据库连接,这个连接被注册到本地的DTC(在这里则是服务器A的DTC)。组件A调用了组件B上的一个方法,而它本身也需要一个事务。组件B和服务器D上的数据库有一个数据库连接,这个连接则被注册到服务器B的DTC。在数据库系统C和D上也有DTC运行,它们管理着与其相关系统的资源管理器的事务。因为所有四个DTC都参与协调事务,所以事务中任何一个参与者可以中止它。譬如,如果服务器D的资源管理器不能顺利地通过准备阶段,它将中止事务,
这样在服务器D的DTC将通知事务的其他参与者进行回滚操作。而另一个方面,如果事务的所有参与者都成功通过了准备阶段,那么这些DTC就会谐调完成这个事务。

图7-1 在分布式事务协调器管理下的事务






