2PC与3PC
一、二阶段提交
2PC:又名二阶段提交,将事物提交分成两个阶段来进行处理。它是一种分布式数据一致性的协议。目前绝大多数关系型数据库都使用2PC来完成事物操作,利用该协议能够方便地完成分布式事物协调者和参与者,统一决定事物的提交和回滚,从而保证分布式数据的一致性。
第一阶段是提交事物请求。这个阶段可以理解为投票阶段,即协调者向所有参与者发送事物内容,询问是否可以执行事物提交操作,并开始等待参与者的响应(有超时时间)。协调者执行事物操作(但不提交事物!!!!!!!!!),生成undo和redo日志。参与者向协调者反馈响应结果。
第二阶段是执行事物提交。协调者根据参与者的反馈来决定最终是否进行事物提交操作,正常情况下分成两种情况:执行事物提交或者中断事物(所有反馈者都反馈yes或者至少有一个参与者反馈no),这时协调者向所有参与者发送commit或者rollback请求,参与者进行事物提交操作后并向协调者发送ack消息,从而完成或者回滚事物。
2PC的优缺点:优点:简单粗暴。缺点:可能会造成脑裂,同步阻塞,单点问题,太过保守。
二、三阶段提交
3PC:又名三阶段提交,将事物提交分成CanCommit、PreCommit、DoCommit三个阶段。
第一阶段:CanCommit阶段,协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。
第二阶段:协调者根据参与者的反应情况来决定是否可以记性事务的PreCommit操作。根据响应情况,有以下两种可能:假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事务的预执行(和2PC的第一阶段一样)。假如有任何一个参与者向协调者发送了No响应或者等待超时之后,协调者都没有接到参与者的响应,那么就执行事务的中断。
第三阶段:该阶段进行真正的事务提交(和2PC的第二阶段一样)。在doCommit阶段,如果参与者无法及时接收到来自协调者的doCommit或者rebort请求时,会在等待超时之后,会继续进行事务的提交。(其实这个应该是基于概率来决定的,当进入第三阶段时,说明参与者在第二阶段已经收到了PreCommit请求,那么协调者产生PreCommit请求的前提条件是他在第二阶段开始之前,收到所有参与者的CanCommit响应都是Yes。(一旦参与者收到了PreCommit,意味他知道大家其实都同意修改了)所以,一句话概括就是,当进入第三阶段时,由于网络超时等原因,虽然参与者没有收到commit或者abort响应,但是他有理由相信:成功提交的几率很大。)