2PC的一致性的理解

老师,麻烦问一下。我看野猪书(Design Data Intensive Applications)和网上一些资料说在phase1阶段,参与者就已经开始在各自的机器上开始刷磁盘,做了transaction中能在自己本地上做的所有事情了,并且记录自己的undo和redo的信息。那么到了phase2的时候,如果有的参与者(没做任何事情在收到C的回执之前)就发生了永久掉线,那么野猪书上说Coordinator的信息会持续不断的向掉现的participants上写。那您看这样就会出现部分的P被commit 或者abort,而永久掉线的P就啥也做不了。从概念上说在这种情况下分布式事务永远没有完成,但这种情况算数据不一致么?

类似的还有,所有P在phase1中把yes 回复给C,但是C在回复commit或者abort的时候,发送了一部分的时候突然挂了。这也会出现部分P执行了C给的命令,而其他的没有。那么就算指派来新的C,并且可以拿到老的C所有日志,在这种情况下,这个是不是也算数据发生了不一致呢。

  1. 没有机器永久掉线是 2PC 的基本假设之一。你说的部分机器掉线的情况,我们认为是 2PC 进行了一半的中间状态。在这个时候用户理论上不能对数据进行读写,如果进行读写,显然会不一致。只有在 2PC 完成之后,数据才一致。
  2. Coordinator 如果挂了,当它重启之后,可以恢复到挂之前的状态,2PC 顺利完成后数据是一致的。
    总结一下,在 2PC 开始但是未完成前,我们需要保证其他进程不能对相关资源进行读写。此期间因为无法读写,从客户端角度无所谓一致不一致。有了这个前提,2PC 可以保证数据一致性。