0

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

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

如何解决这个问题或者它真的是一个问题?

4

1 回答 1

0

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

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

于 2017-07-20T11:00:32.627 回答