2PC
- 简述:2PC是用来解决分布式事务的原子性问题,通过将事务的操作分成两步来完成。在执行的过程中,有两种角色,分别是协调者和参与者,协调者负责整体的调度和协调,参与者负责具体事务的执行
- 执行过程
- 阶段一:提交事务请求阶段。协调者向参与者提交事务请求,参与者在接收到请求之后执行事务操作,同时记录Undo和Redo信息,以便事务的回滚,同时需将执行结果反馈给i协调者
- 阶段二:执行事务提交阶段。协调者根据阶段一参与者的反馈结果执行具体操作。如果参与者全部执行成功的话,协调者会发送事务提交请求,各个参与者执行提交并反馈结果。如果有参与者执行不成功或等待超时的话,事务便会中断,各个参与者需执行回滚操作,同时提交反馈结果
- 总结:2PC协议存在容错性方面的问题,如果协调者发生异常或者网络通信发生异常,整个协议便无法工作,还可能会导致不一致状态的出现,即任意一个节点的失败都会导致整个事务的失败。另外参与者在等待期间是同步阻塞的即一直持有资源并不做其他操作
- 流程图:
3PC
- 简述:3PC是2PC的改进版,将事务操作分为三阶段来完成,用于降低参与者的阻塞范围,并能在出现协调者单点故障的情况下达成一致
- 执行过程
- 阶段一:CanCommit阶段。事务询问阶段,协调者询问参与者 并获取反馈
- 阶段二:PreCommint阶段。若参与者无法正常反馈,则结束事务。否则,发送执行事务操作指令,参与者执行具体事务并记录Undo和Redo信息,并反馈结果
- 阶段三:DoCommit阶段。协调者正常工作且通信正常时,发送事务提交请求或者取消请求。否则,参与者会在等待超时之后自行提案事务。
- 总结:相比2PC,3PC通过将事务进一步细分来降低参与者的阻塞范围,并且能够在协调者单点故障的时候继续达成一致,但这种做法也可能会导致数据的不一致
- 流程图: