面试题答案
一键面试PostgreSQL处理分布式事务机制 - 两阶段提交(2PC)实现
- 准备阶段(Prepare Phase):
- 当一个分布式事务发起时,协调者(通常是发起事务的节点)会向所有参与该事务的节点发送
PREPARE
消息。 - 每个参与节点接收到
PREPARE
消息后,会执行事务中与本节点相关的操作,如修改数据等。但此时并不会真正提交事务,而是将事务的状态标记为“准备提交”,并记录相关的日志信息(如预写日志WAL,Write - Ahead Log)。 - 然后,每个参与节点向协调者发送
READY
消息,表明本节点已准备好提交事务。
- 当一个分布式事务发起时,协调者(通常是发起事务的节点)会向所有参与该事务的节点发送
- 提交阶段(Commit Phase):
- 协调者收集到所有参与节点的
READY
消息后,会决定事务是否可以提交。如果所有节点都准备好(即都发送了READY
消息),协调者会向所有参与节点发送COMMIT
消息。 - 每个参与节点接收到
COMMIT
消息后,会正式提交事务,将之前准备阶段记录的日志持久化,并更新数据状态。 - 如果有任何一个节点在准备阶段返回失败(未发送
READY
消息),协调者会向所有参与节点发送ROLLBACK
消息,各节点接收到ROLLBACK
消息后会回滚事务,撤销准备阶段所做的所有操作。
- 协调者收集到所有参与节点的
节点故障时的故障恢复确保数据一致性
- 协调者故障:
- 如果协调者在准备阶段故障,其他参与节点会等待协调者恢复。由于参与节点处于“准备提交”状态,它们不会自行决定提交或回滚事务。
- 协调者恢复后,会从日志中读取事务的状态。如果已收到所有节点的
READY
消息,协调者会向所有节点发送COMMIT
消息;如果有节点未发送READY
消息或存在其他异常,协调者会发送ROLLBACK
消息。
- 参与节点故障:
- 在准备阶段故障:如果一个参与节点在准备阶段故障,协调者不会收到该节点的
READY
消息。协调者会向其他已准备好的节点发送ROLLBACK
消息,确保所有节点回滚事务,从而保证数据一致性。 - 在提交阶段故障:如果一个参与节点在接收到
COMMIT
消息后但在实际提交事务前故障,当该节点恢复时,它会从日志中读取事务状态。由于已收到COMMIT
消息,它会继续完成事务提交操作,确保与其他已提交节点的数据一致性。同样,如果节点在接收到ROLLBACK
消息后故障,恢复时会根据日志完成回滚操作。
- 在准备阶段故障:如果一个参与节点在准备阶段故障,协调者不会收到该节点的