3PC也是一致性协议的一种,在2PC的基础上做了一些改进,于是有了3PC。
3PC是把2PC的阶段二(事务提交)一分为二,形成了由CanCommit、PreCommit、DoCommit三个阶段组成。
3PC协议过程
阶段一: CanCommit
1. 事务问询
协调者向参与者发送CanCommit请求,询问是否可以执行事务提交操作。
2. 事务反馈
各参与者接受到CanCommit请求后,如果认为自身可以成功执行事务,则反馈Yes响应,并进入预备状态;否则反馈No响应
阶段二: PreCommit
协调者根据1.2各参与者的响应情况来决定是否执行PreCommit,即存在2种情况。
1. 执行PreCommit
1.1 发送PreCommit请求
协调者向所有参与者发送PreCommit请求,并进入Prepared阶段。
1.2 执行事务操作
各参与者收到PreCommit请求后会执行事务操作,并记录Undo和Redo信息到事务日志中。
1.3 反馈结果
如果参与者成功执行了事务操作,则反馈Ack响应。同时等待最终的指令:终止or提交。
2. 中断事务
如果在阶段一(事务反馈)中协调者收到了任何一个参与者反馈No响应,或在等待超时之后,协调者就会中断事务。
2.2.1 发送中断请求
协调者向所有参与者发送abort请求。
2.2.2 中断事务
所有收到abort请求或者等待超时的参与者执行中断事务操作。
阶段三:DoCommit
该阶段执行真正的事务提交,会存在以下两种情况:
情况一:执行DoCommit
1.发送提交请求
如果协调者处于正常的工作状态,且收到了所有参与者的Ack响应,那么它将从“预提交”状态转换到“提交状态”,并向所有的参与者发送doCommit请求。
2. 事务提交
参与者接收到doCommit请求后,会正式执行事务提交操作,并在完成之后释放整个事务执行期间占用的资源。
3. 反馈结果
参与者完成事务提交后,向协调者发送Ack响应。
4. 完成事务
协调者接收到所有参与者反馈Ack消息后,完成事务。
情况二:中断事务
在PreCommit阶段有任意一个参与者向协调者返回了No响应,或者等待超时之后,协调者就会中断事务。
1. 发送中断请求
协调者向所有的参与者发送abort请求。
2. 事务回滚
参与者收到abort请求后,利用在PreCommit阶段中记录的Undo信息来执行事务回滚,然后释放事务期间占用的资源。
3. 反馈事务回滚结果
参与者完成事务回滚操作后,向协调者发送Ack响应。
4. 中断事务
协调者收到所有参与者的Ack消息后,中断事务。
需要注意的是,一旦进入到阶段三之后,可能会出现以下两种故障:
- 协调者出现问题。
- 协调者和参与者之间的网络出现故障。
出现上述情况之后,最终都会导致参与者无法及时接收到来自协调者的doCommit或是abort请求,针对这种情况,参与者在等待超时之后,继续进行事务提交。
网友评论