分布式交易协议

时间:2017-01-12 22:58:08

标签: transactions theory 2phase-commit

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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