3PC是 Three-Phase Commit的缩写,即三阶段提交,是2PC的改进版,将二阶段提交协议的"提交事务请求"过程一分为二,形成了CanCommit、PreCommit、和doCommit三个阶段组成的事务处理协议。
阶段一:CanCommit
1、事务询问:协调者向所有的参与者发送一个包含事务内容的CanCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
2、各参与者向协调者反馈事务询问的响应:参与者在收到协调者的CanCommit请求后,正常情况下,如果其可以顺利执行事务,就反馈Yes响应,并进入预备状态,否则反馈No响应。
阶段二:PreCommit
正常情况下,包含两种可能:
执行事务预提交--假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事务预提交。
1、发送预提交请求:协调者向所有的参与者发出PreCommit请求,并进入Prepared阶段。
2、事务预提交:参与者接收到PreCommit请求后,会执行事务操作,并将Undo和Redo信息记录到事务日志中。
3、各参与者向协调者反馈事务询问的响应:如果参与者成功执行了事务操作,那么就会反馈给协调者Ack响应,同时等待最终的指令:提交或终止。
中断事务--如果有任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者仍无法接收到所有参与者的反馈响应,就会中断事务。
1、发送中断请求:协调者向所有参与者节点发出中断请求。
2、中断事务:收到协调者的中断请求,或者在等待超时之后,参与者都会中断事务。
阶段三:doCommit
有以下两种可能:
执行提交:
1、发送提交请求:协调者从"预提交"状态转换到"提交"状态,并向所有的参与者发送doCommit请求。
2、事务提交:参与者接收到doCommit请求后,执行事务提交,并在完成之后释放占用的事务资源。
3、反馈事务提交结果:参与者在完成事务提交后,向协调者发送Ack消息。
4、完成事务:协调者收到所有参与者反馈的Ack消息后,完成事务。
中断事务:任意一个参与者向协调者反馈No响应,或在等待超时之后,协调者仍没有收到所有参与者的反馈响应,就中断事务。
1、发送中断请求:协调者向所有参与者发送中断请求。
2、事务回滚:参与者收到中断请求后,利用其在阶段二中记录的Undo信息来执行回滚操作,并在完成回滚之后释放占用的事务资源。
3、反馈事务回滚结果:参与者完成事务回滚之后,向协调者发送Ack消息。
4、中断事务:协调者接收到所有参与者反馈的Ack消息后,中断事务。
问:何为"参与者"?何为"协调者"?它们之间的关系是怎样的?
答:当一个事务操作需要跨越多个分布式节点的时候,为了保持事务的ACID特性,需要引入"协调者"来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点称为"参与者"。协调者负责调度参与者的行为,并最终决定这些参与者是否要把事务进行真正提交。
优点:相对于二阶段提交协议(2PC),3PC最大的优点是降低了参与者的阻塞范围,并在出现单点故障之后继续达成一致。
缺点:可能会出现数据的不一致性。