📜  三阶段提交协议(1)

📅  最后修改于: 2023-12-03 15:35:53.214000             🧑  作者: Mango

三阶段提交协议

简介

三阶段提交协议(3PC)是一种用来保证分布式系统中事务的原子性和一致性的协议。与两阶段提交协议(2PC)相比,3PC可以减少分布式系统在某些情况下产生的不必要的阻塞。

三个阶段
CanCommit

在CanCommit阶段,协调者向参与者发送CanCommit消息,询问参与者是否能够提交事务。参与者接收到CanCommit消息后,进行事务的本地预处理,并返回一个vote信息,用于表示它是否准备好提交事务。

public void canCommit(Transaction transaction, List<Participant> participants) {
    for (Participant participant : participants) {
        boolean vote = participant.canCommit(transaction);
        if (!vote) {
            abort(transaction, participants);
            return;
        }
    }
    preCommit(transaction, participants);
}
PreCommit

在PreCommit阶段,协调者向所有参与者发送PreCommit消息,告诉它们已经收到了所有参与者的CanCommit的响应。如果并且协调者自己也已经准备好提交,则它会让所有参与者提交事务。如果在接收到PreCommit消息后参与者发现问题,它会返回Abort,否则返回Ack。

public void preCommit(Transaction transaction, List<Participant> participants) {
    for (Participant participant : participants) {
        boolean ack = participant.preCommit(transaction);
        if (!ack) {
            abort(transaction, participants);
            return;
        }
    }
    doCommit(transaction, participants);
}
DoCommit/Abort

在DoCommit和Abort阶段,协调者告诉参与者事务应该被提交还是中止。如果协调者决定提交事务,则它会广播Commit消息。如果协调者决定中止事务,则它会广播Abort消息。

public void doCommit(Transaction transaction, List<Participant> participants) {
    commit(transaction, participants);
    broadcastCommit(transaction, participants);
}

public void abort(Transaction transaction, List<Participant> participants) {
    rollback(transaction, participants);
    broadcastAbort(transaction, participants);
}
优缺点

优点:

  • 与2PC相比,拥有更好的性能,减少了数据库或事务处理系统的工作量。
  • 安全性更高,减少了不必要的阻塞。

缺点:

  • 事务被提交的时间长于2PC,因此在系统出现故障时,恢复会更复杂。
  • 对于网络分区、节点故障等情况,3PC的性能不如2PC。
结论

3PC可以提高分布式系统的性能,并且与2PC相比,增加了更多的安全保障,对于某些需要高可用性和高性能的系统,可以使用3PC协议来保证系统的稳定性。