关于酸:分布式事务如何工作(例如MSDTC)?

关于酸:分布式事务如何工作(例如MSDTC)?

How do distributed transactions work (eg. MSDTC)?

我以一种模糊的方式了解常规ACID交易的工作方式。您对数据库执行某些工作的方式是直到设置了某种提交标志才确认工作。提交部分基于一些基本假设(例如,单个磁盘块写入是原子的)。万一发生灾难性错误,您只需在恢复阶段清除未提交的数据即可。

分布式交易如何运作?在一些MS文档中,我读到您可以通过某种方式跨数据库和文件系统执行事务(除其他外)。

这项技术可能会(并且可能会)用于安装程序,在此您希望程序完全安装或完全不存在。您只需在安装程序启动时开始事务。接下来,您可以连接到注册表和文件系统,进行定义安装的更改。完成工作后,只需提交即可;如果由于某种原因安装失败,则回滚。这个神奇的分布式事务处理协调器会自动为您清理注册表和文件系统。

如何以这种方式处理两个不同的系统?在我看来,总是有可能使系统处于不一致状态,在该状态下文件系统已提交更改,而注册表未提交更改。我认为在MSDTC中甚至可以通过网络执行事务。

我已经阅读了http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx,但是感觉仅仅是解释的开始,第4步应该大大扩展。

编辑:从我在http://en.wikipedia.org/wiki/Distributed_transaction上收集到的信息中,可以通过两阶段提交(http://en.wikipedia.org/wiki/Two-phase_commit)来实现。读完这篇文章后,我仍然对100%的方法还不了解,步骤之间似乎有很多错误的余地。


关于"步骤4":

The transaction manager coordinates
with the resource managers to ensure
that all succeed to do the requested
work or none of the work if done, thus
maintaining the ACID properties.

当然,这要求所有参与者提供适当的接口和(无错误的)实现。界面看起来像这样:

1
2
3
4
5
public interface ITransactionParticipant {
    bool WouldCommitWork();
    void Commit();
    void Rollback();
}

提交时的事务管理器查询所有参与者是否愿意提交事务。如果参与者能够在所有允许的错误条件(验证,系统错误等)下提交此事务,则仅可以声明此声明。在所有参与者都声明了提交事务的能力之后,管理器将Commit()消息发送给所有参与者。如果有任何参与者提出错误或超时,则整个事务将中止并且单个成员将回滚。

该协议要求参与者在声明其提交能力之前已经记录了其整个交易内容。当然,这必须采用特殊的本地事务日志结构,以便能够从各种故障中恢复。


推荐阅读