分布式事务
2PC 两阶段提交
分别是commit请求阶段和commit提交阶段
成立的假设
-
- 分布式系统中,存在一个节点作为协调者,其他节点作为参与者,且节点之间可以进行网络通信
-
- 所有节点都采用预写式日志,且日志被写入后即保持在可靠的存储设备上,即使节点损坏,也不会导致日志数据的消失
-
- 所有节点不会永久性损坏,即使损坏仍然可以恢复
基本说明
- 1.协调者想所有的参会者发送QUERY TO COMMIT 消息,询问是否可以执行提交事务,并开始等待各参与者的响应
- 2.参与者执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志,返回Yes消息给协调者;如果参与者执行失败,则返回No消息给协调者
- 成功
- 1.协调者向所有的参与者发出COMMIT的请求
- 2.参与者完成COMMIT操作,并释放在整个事务期间占用的资源
- 3.参与者向协调者发送ACK消息
- 4.协调者接收到所有参与者反馈的ACK消息后,完成事务
- 失败
- 1.协调者向参与者发出ROLLBACK的请求
- 2.参与者利用之前写入的Undo信息执行回滚,并释放在整个事务期间占用的资源
- 3.参与者想向协调者发送ACK信息
- 4.协调者接收到所有参与者反馈的ACK消息后,完成事务
优点
- 简单
缺点
- 同步阻塞,性能存在明显问题,难以支持高并发的应用场景
- 状态不一致,如果第二段提交的时候参与者未接收到消息就会出现超时回滚的情况,出现状态不一致
- 单点故障,协调者出现问题参与者就会一直阻塞下去,整个集群就无法提供服务
3PC:三阶段提交。
分别是提交判断阶段(协调者询问参与者是否可以提交事务),准备提交阶段(协调者向参与者发送准备提交的信息),提交执行阶段(协调者向参与者发送提交信息),只要到了第三阶段,如果参与者未接收到提交数据,也会变成提交