2PC
2PC,是Two-Phase Commit的缩写,即二阶段提交协议,为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性而设计的一种算法。
阶段一:提交事务请求
- 事务询问
协调者向参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。 - 执行事务
参与者执行事务操作,并将Undo和Redo信息记入事务日志中。 - 参与者响应
如果参与者成功执行了事务操作,那么久反馈给协调者Yes,表示事务可以执行;如果参与者没有成功执行事务,那么反馈给协调者No响应,表示事务不可以执行。
阶段二:执行事务提交
执行事务提交
假如协调者从所有者的反馈响应都是Yes,那么就会执行事务提交。
- 发送提交请求
协调者向所有的参与者发送Commit请求。 - 事务提交
参与者受到Commit请求后,会正式执行事务提交操作,并在完成提交之后释放在整个事务期间占用的事务资源。 - 反馈事务提交结果
参与者在完成事务提交之后,会向协调者发送Ack消息。 - 完成事务
协调者接收到所有参与者反馈的Ack消息后,完成事务。
中断事务
假如任何一个参与者向协调者反馈了No的响应,或者是在等待超时之后,协调者无法接收到参与者的响应,那么该次事务就会中断。
- 发送回滚请求
协调者向所有参与者节点发出Rollback请求。 - 事务回滚
参与者接收到Rollback请求后,会利用其在阶段一中记录的Undo信息来执行事务回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源。 - 反馈事务回滚结果
参与者在完成事务回滚之后,向协调者发送Ack消息。 - 中断事务
协调者接收到所有参与者反馈的Ack消息后,完成事务中断。
优缺点
二阶段提交协议的优点:原理简单,实现方便。
二阶段提交协议的缺点:同步阻塞,单点问题,数据不一致,太过保守
- 同步阻塞
在二阶段提交的执行过程中,所有参与者与该事务的逻辑都处于阻塞状态,也就是说,在这段期间,所有的参与者无法进行其他的任何操作。 - 单点问题
单点问题就是说,所有的参与者都要和协调者进行交互,但是如果协调者出现宕机,那么所有的参与者都无法正常进行事务操作。 - 数据不一致
如果在提交节点协调者向部分参与者发送了commit请求,还以一部分参与者因为协调者因自己宕机或者网络连接出现问题而没有接受到Commit的请求,这就会造成参与者出现数据不一致的情况。 - 太过保守
2PC采用的协议没有一个较好的容错机制,例如参与者因为网络问题或者自身故障而无法给协调者发送响应信息,这时协调者只能通过自身的超时机制来进行事务的回滚操作。
3PC
3PC,是Three-Phase Commit的缩写,即三阶段提交协议,是二阶段提交协议的改进版。
阶段一:CanCommit
- 事务询问
协调者向所有的参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。 - 参与者响应
在参与者接收到协调者的canCommit请求,如果可以执行,参与者发送Yes进行反馈,否者发送No。
阶段二:PreCommit
如果协调者从阶段一中的CanCommit响应中得到Yes反馈
1. 发送预提交请求
协调者向所有的参与者发送preCommit请求,并进入Prepared阶段。
2. 事务预提交
参与者接收到preCommit请求后,会执行事务操作,并将Undo和Redo信息记录到事务日志中。
3. 参与者响应
如果参与者成功执行了事务操作,就会返回给协调者Ack响应,同时等待最终指令。
如果协调者从阶段一中的CanCommit响应中得到No反馈,或者协调者等待超时后
- 发送中断请求
协调者会向所有的参与者发送abort请求。 - 中断事务
无论是接收到协调者的abort请求,还是等待协调者的响应而出现的超时,参与者都会中断事务。
阶段三:doCommit
执行提交
- 发送提交请求
- 事务提交
- 反馈事务提交结果
- 完成事务
中断事务
- 发送中断请求
- 事务回滚
- 中断事务
- 完成事务
在阶段三中,会出现以下两种故障:
- 协调者出现问题
- 协调者和参与者网络出现问题
无论出现哪种情况,最终都会导致参与者无法及时接收到来自协调者的doCommit或者是abort请求,针对这样的情况,参与者都会在等待超时之后,继续进行事务提交。
优缺点
优点是降低了参与者的阻塞范围,并且能够在出现单点故障后继续达成一致性。缺点是参与者接收到preCommit请求后,如果此时出现网络问题,这种情况下参与者依然会进行事务提交,这会导致数据的不一致。