分布式事务如何工作(例如MSDTC)?

时间:2008-09-11 06:01:04

标签: transactions acid mstdc

我以一种模糊的方式理解常规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%的方法,似乎步骤之间存在很大的误差空间。

1 个答案:

答案 0 :(得分:4)

关于“第4步”:

  

事务管理器协调   与资源经理一起确保   所有人都成功地完成了要求   因此,如果完成了工作或没有工作   保持ACID属性。

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

public interface ITransactionParticipant {
    bool WouldCommitWork();
    void Commit();
    void Rollback();
}

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

此协议要求参与者在断言其提交能力之前记录其整个事务内容。当然,这必须在一个特殊的本地事务日志结构中才能从各种故障中恢复。