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

交易管理器与资源经理协调,以确保所有人成功地完成所请求的工作或完成工作,从而维护酸性属性。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top