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

Mar*_*tin 13 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%的方法,似乎步骤之间有很多错误的余地.

Dav*_*itt 4

关于“第4步”:

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

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

public interface ITransactionParticipant {
    bool WouldCommitWork();
    void Commit();
    void Rollback();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果您有参与者 A 和 B,A 已提交并返回成功,然后 B 已提交并返回失败,但在 A 回滚之前,网络就掉线了,会发生什么情况?另一种情况是网络故障可能会阻止 B 被提交。 (3认同)