三阶段提交
三阶段提交(Three-phase Commit)是
浅谈二阶段提交的升级版。分为CanCommit、PreCommit、DoCommit三个阶段。
CanCommit
- 事务发起方发起请求调用给协调者
- 协调者向所有参与者节点询问是否可以提交,然后等到所有节点的响应
- 参与者执行判断是否可以顺利执行事务
- 回应YES/NO
PreCommit
根据参与者反馈的结果,协调者会有两种处理方式。如果所有参与者都返回YES,则到事务预提交阶段,如果有部分参与者返回NO,或者在超时时间内协调者没收到参与者的反馈,则到事务中断阶段。
事务预提交
- 协调者向所有参与者节点发出PreCommit请求
- 参与者执行所有的事务准备,并将Undo信息和Redo信息写入日志
- 参与者向协调者发送ack消息,等待协调者下一步请求
事务中断
- 协调者向所有参与者节点发出Abort请求
- 参与者中断事务
- 参与者向协调者发送ack消息
DoCommit
事务预提交后,进行真正的提交阶段。
- 协调者从“预提交状态”转换为“提交”状态,并向所有参与者节点发出Commit请求
- 参与者提交事务,并释放事务期间占的资源
- 参与者向协调者发送ack消息
- 协调者收到所有ack消息后,向事务方反馈完成事务信息
在这个阶段中,不管是协调者出现了问题,还是协调者和参与者之间网络 出现了故障,参与者无法接受到协调者发出的信息,在等待超时后,会自动提交,虽然避免了占用事务的阻塞,但是数据的一致性,还是依然存在的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。