【问题标题】:Distributed transaction agreement分布式交易协议
【发布时间】:2017-01-12 22:58:07
【问题描述】:

假设我们有 2 个执行汇款的节点。节点 A 发起从一个账户到另一个账户的转账,节点 B 负责完成这笔交易。因此,要完成此交易,节点 A 必须向节点 B 发送一些 TRANSFER 请求,并且在成功时节点 B 必须以确认 TRANSFER 请求来响应。我看到的可能问题如下:收到 TRANSFER 请求后,节点 B 执行了事务,但未能发送响应。所以节点A认为请求失败并报告问题,但事务实际上已经完成。

即使考虑两阶段提交协议(节点 B 在收到 TRANSFER 请求时不提交事务,而只是执行它并等待来自节点 A 的一些提交确认)也可能存在类似的问题:当节点 A 发送 TRANSFER 提交请求时,它无法确定节点 B 收到了该请求并且事务实际上已完成(即使此请求已传递到目标主机,我们也无法确定它是由某个进程提交的)。

如何解决这个问题还是真的是个问题?

【问题讨论】:

    标签: transactions theory 2phase-commit


    【解决方案1】:

    我会说,是的,这是一个需要解决的问题。如果传输请求失败,您无法确定它是否已被节点 B 处理,或者在处理发生之前(或在请求被传递到 B 的时间之前)发生故障。

    在2PC的情况下通过引入prepare phase来解决。数据处理首先完成,但在事务提交之前,外部世界看不到更改。如果在准备处理之前发生故障,则整个事务将被中止。如果 B 崩溃,那么在重新启动时就没有事务的概念,因此如果只有连接失败,它就会被中止,那么 B 事务最终会超时并被中止。如果在准备处理后发生故障,那么所有工作都应该提交。如果与 B 的通信失败,则由事务管理器(定期)尝试联系 B 并在最后完成事务。

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 2018-05-07
      • 2013-02-26
      • 2011-05-12
      • 2017-07-30
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多