两阶段提交是否安全

Is 2-Phase commit safe or not

我发现很多读物都说 2PC 是安全的,这意味着它要么提交事务,要么回滚。更具体地说,[如果有人承诺,没有人会放弃;如果一个中止,没有人承诺]。 (http://www0.cs.ucl.ac.uk/staff/B.Karp/gz03/f2010/gz03-lecture6-2PC.pdf)

Wikipedia开始,我知道在提交阶段,所有进程都会做以下事情:

  1. 协调器向所有参与者发送提交消息。
  2. 每个参与者完成操作并释放事务期间持有的所有锁和资源。
  3. 每个参与者向协调器发送确认。
  4. 协调器在收到所有确认后完成事务。

不知道在stage 1中,coordinator会不会在给多个participant发送消息后失败了,也就是说有的participant会收到commit message,有的不会。然后那些收到的人将提交,而其他人仍将被阻止。所以我觉得2PC在这里不能保证安全?

正如维基百科的文章所说:

If the coordinator fails permanently, some participants will never resolve their transactions: After a participant has sent an agreement message to the coordinator, it will block until a commit or rollback is received.

这里的关键词是“永久”。在您的第一个 link 中,2PC 算法也被标记为安全,仅适用于控制器重启而非永久死机。

所以 2PC 是安全的,同时它的组件可以交互(即使有重启、连接丢失和其他临时问题)。