14

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

1 回答 1

4

关于“第4步”:

事务管理器与资源管理器协调以确保所有成功完成请求的工作或如果完成则没有任何工作,从而维护 ACID 属性。

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

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

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

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

于 2008-09-11T06:31:04.537 回答