2PC与3PC分布式事务
引言
分布式一致性,可以分为强一致性、弱一致性和最终一致性。其中两阶段提交模型(2PC)和三阶段提交模型(2PC)是实现强一致性的两种常见模型。
1 两阶段提交模型
1.1 原理介绍
两阶段提交模型分为参与者和协调者,参与者可以理解为例如分布式存储中的数据节点;协调者是控制分布式事务的大脑。整个过程由两个阶段完成,即准备阶段和提交阶段。
1.1.1 准备阶段
准备阶段的过程如下:
- 协调者向所有参与者发起预操作请求,并等待各个参与者的响应;
- 参与者接收到协调者的预操作请求后执行操作,并将Undo信息、Redo信息和Lock记录写入日志。整个过程都在一个本地事务中进行;
- 参与者执行操作成功,给协同者成功响应;反之,返回失败响应。
1.1.2 提交阶段
如果准备阶段,协调者等待某个参与者响应超时 或 至少一个参与者返回失败,那么就会执行撤销操作;反之,所有参与者返回成功,则执行正式提交。
撤销操作:
- 协调者向所有参与者发起撤销请求;
- 参与者接收到撤销请求后,利用Undo信息回滚操作,并删除Undo信息、Redo信息和Lock记录。整个过程都在一个本地事务中进行;
- 参与者执行完成,都会返回协调者撤销完毕;
- 当收到所有参与者撤销完毕后,协调者取消事务。
正式提交:
- 协调者向所有参与者发起提交请求;
- 参与者接收到提交请求后,删除Undo信息、Redo信息和Lock记录从而释放事务资源。整个过程都在一个本地事务中进行;
- 参与者执行完成,都会返回协调者提交完毕;
- 当收到所有参与者提交完毕后,协调者完成事务。
1.2 优缺点总结
1.2.1 优点
- 相对于三阶段提交模型,原理简单、方便实现。
1.2.1 缺点
- 同步阻塞:所有的参与者到结束都会锁住资源,并发性不高。例如协调者宕机后,参与者资源无法释放。
- 数据不一致:当协调者向部分参与者发生了正式提交请求后出现网络异常,那么会导致部分参与者提交,另一部分没有提交,从而出现不一致现象。但可以通过人工运维监控修复解决。
- 状态丢失:当协调者发出正式提交请求后,唯一接收到的参与者和协调者都同时宕机。那么其他参与者即使重新协商一个协调者也无法得知当前事务的状态。
2 三阶段提交模型
2.1 原理介绍
三阶段提交模型同样分为参与者和协调者。在两阶段前面加入询问阶段,即询问阶段、准备阶段和提交阶段。
2.1.1 询问阶段
询问阶段又称CanCommit阶段。过程如下:
- 协调者向所有参与者发送CanCommit请求,查看是否可以执行事务提交操作。然后等待所有参与者的响应。
- 每个参与者接到CanCommit请求之后,如果可以顺利执行事务就返回Yes响应,并进入预备状态;否则反会No。然后等待协调者进一步请求。
2.1.2 准备阶段
准备阶段又称PreCommit阶段。如果询问阶段协商者接收到全部参与者回复Yes响应,那么就会执行预提交;反之,执行中断操作。
扫描二维码关注公众号,回复:
12844921 查看本文章
中断操作:
- 协调者向所有参与者发送中断请求;
- 参与者收到中断请求之后,执行事务的中断。特别地,在询问阶段阶段,参与者返回响应后等待协调者下一步请求超时,也会执行事务中断。
预提交:
- 协调者向所有参与者发送PreCommit请求,然后等待所有参与者的响应。
- 参与者接收到协调者的PreCommit请求后执行操作,并将Undo信息、Redo信息和Lock记录写入日志。整个过程都在一个本地事务中进行;
- 参与者执行操作成功,给协同者成功响应;反之,返回失败响应。然后等待下一步请求。
2.1.3 提交阶段
准备阶段又称doCommit阶段。如果准备阶段执行了预提交,协调者等待某个参与者响应超时 或 至少一个参与者返回失败,那么就会执行撤销操作;反之,所有参与者返回成功,则执行正式提交。
撤销操作:
- 协调者向所有参与者发起撤销请求;
- 参与者接收到撤销请求后,利用Undo信息回滚操作,并删除Undo信息、Redo信息和Lock记录。整个过程都在一个本地事务中进行;
- 参与者执行完成,都会返回协调者撤销完毕;
- 当收到所有参与者撤销完毕后,协调者取消事务。
正式提交:
- 协调者向所有参与者发起提交请求;
- 参与者接收到提交请求后,删除Undo信息、Redo信息和Lock记录从而释放事务资源。整个过程都在一个本地事务中进行。特别地,参与者在准备阶段进行预提交后,等待协调者下一步请求超时后也会执行该步和后续操作;
- 参与者执行完成,返回协调者提交完毕;
- 当收到所有参与者提交完毕后,协调者完成事务。
2.2 优缺点总结
2.2.1 优点
- 由于参与者也加入了超时机制,所以不会像两阶段那样,一直锁住资源的情况。
2.2.1 缺点
- 当出现网络原因或协调者宕机后,成功执行了准备阶段的预提交的参与者节点在超时后会自动进行正式提交。同时,存在其他节点没有成功预提交,那么就会出现数据不一致现象。