3PC是在2PC的基础上,将第二阶段的提交协议中“提交事务请求”过程一分为二,形成了由CanCommit
、PreCommit
和do Commit
三个阶段组成的事务处理协议。
阶段1: CanCommit
- 事务询问
- 各参与者向协调者反馈事务询问的相应
阶段2: PreCommit
在阶段2中,协调者会根据参与者的反馈情况来决定是否可以进行事务的PreCommit操作,正常情况下,包含两种可能:
- 执行事务预提交
假如协调者从所有参与者获得的反馈都是YES,就会执行事务的预提交
- 发送预提交请求
- 事务预提交
- 各参与者向协调者反馈事务执行的相应
- 中断事务
假如任何一个参与者向协调者反馈了NO响应,或者在等待超时之后,协调者尚无法接收到所有的参与者反馈,就会中断事务
- 发送中断请求:协调者发送abort请求
- 中断事务:无论是收到来自协调者的abort请求,或是在等待协调者请求过程中超时,参与者都会中断事务
阶段3: doCommit
进行真正的事务提交
- 执行提交
- 发送提交请求: 协调者发送doCommit请求
- 事务提交
- 反馈事务提交结果
- 完成事务
- 中断事务
- 发送中断请求
- 事务回滚:参与者在接收到abort请求后,会利用在第二个阶段记录的undo信息来执行事务回滚操作,并在回滚之后释放在整个事务执行期间占用的资源。
- 反馈事务回滚结果
- 中断事务
注意
阶段3可能会出现两种故障:
- 协调者出现问题
- 协调者和参与者之间网络出现问题
无论那种情况,最终都会导致参与者无法及时收到来协调者的doCommit
或是abort
请求,参与者在等待超时后,会放弃此次事务再次进行新的事务提交。