2017-01-12 67 views
0

想象一下,我们有2个节点执行汇款。节点A启动从一个账户到另一个账户的资金转账,并且节点B对于完成该交易是可重复的。因此为了完成这个事务,节点A必须向节点B发送一些TRANSFER请求,并且在成功节点B上必须响应确认TRANSFER请求。我看到的可能的问题是:接收到TRANSFER请求后,节点B执行事务但未能发送响应。因此,节点A认为请求失败并报告问题,但事务已经完成。即使考虑两阶段提交协议(,其中节点B在接收到TRANSFER请求时没有提交事务,但仅执行它并等待来自节点A的一些提交确认),可能存在类似的问题:何时节点A发送TRANSFER提交请求,它不能确定节点B接收到该请求和事务实际完成(即使此请求已传送到目标主机,我们也无法确定它是否由某个进程提交)。分布式交易聚合

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

回答

0

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

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