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

时间:2020-03-05 18:51:15  来源:igfitidea点击:

我以一种模糊的方式了解常规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.

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

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

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

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