在分布式系统中,由于一个事务操作需要跨越多个分布式节点,为了保持事务处理的ACID特性,所以引入了协调者和参与者的概念。由协调者进行决策,参与者执行决策。并基于这种思想,衍生出2PC和3PC两种提交协议。
2PC,是Two-Phase Commit的缩写,即二阶段提交,是分布式一致性协议中的一种,用于保证分布式系统中的数据一致性。顾名思义,2PC将整个事务的提交过程分为了两个阶段进行操作。它们分别是:提交事务请求阶段和执行事务提交阶段
至此,2PC的阶段一执行完毕,阶段二会有两种情况,我将分别叙述。
进入该阶段的前提是所有的参与者皆返回YES响应。否则进入中断事务阶段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvtFNImp-1585147625908)(https://donkeyx.top/upload/2020/3/2pc-p2-2-83e2e53e4c404bfc8c59cd7fee411e4a.png)]
进入该阶段的条件是有任意的参与者向协调者返回NO或者在等待过程中等待超时
2PC就是简单的把事务的处理过程分为了投票和执行两个阶段,它的优点就是原理简单,实现方便。但是它的缺点也很明显。比如同步阻塞,单点问题,数据不一致,太过保守等问题。
同步阻塞 是因为在整个分布式事务的投票和执行阶段,各个参与者会等待其他参与者的响应,而在这个过程中无法做其他事情。
单点问题是因为整个分布式事务的处理过程都是由协调者进行调控,如果协调者出现问题,那么整个系统便会不可用。
数据不一致是因为分布式系统是通过网络进行通信,如果在阶段二,协调者发出了commit请求后,发生了局部网络异常,或者协调者未发送完commit请求后就宕机了,就会出现部分节点执行了提交事务操作,部分节点未执行提交事务操作的情况,从而导致整个分布式系统中的数据不一致的情况
太过保守是因为在协调者和参与者 的通信过程中,如果参与者down机,协调者只会依靠超时机制来判断是否需要中断事务,而没有其他方式。
3PC,即3阶段提交。3PC在2PC的基础上,将提交事务请求也就是第二阶段分为了2步,同时也为参与者增加了超时机制,所以3PC也解决了一部分2PC的问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWGRPsCT-1585147625910)(https://donkeyx.top/upload/2020/3/3PC-canCommit-ff8d14d847584efd9622273cd20f68ee.png)]
一阶段也是一个简单的投票过程,主要内容是后面两个阶段,都会分情况进行讨论
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o9lLo5n2-1585147625912)(https://donkeyx.top/upload/2020/3/3PC-preCommit-1-9c1cc2b5e51c4265acee24c09ca9dd5c.png)]
如果所有的反馈都是YES,那么将进入事务预提交阶段。
事务预提交阶段,完成了事务操作,并等待提交事务或者中断事务的指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAukeNN1-1585147625914)(https://donkeyx.top/upload/2020/3/3PC-preCommit-abort-1b4b44915590492abb9f02501f470807.png)]
如果有任意一个参与者反馈了NO或者协调者等待超时。那么将进入中断事务阶段
在该阶段,协调者发送了abort请求后即意味着事务中断,参与者即使没有收到这个请求,也会在等待超时之后自行中断事务。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9ZzDiVR-1585147625916)(https://donkeyx.top/upload/2020/3/3PC-doCommit-cf469e9bbead4b01bfb776877fb9f579.png)]
协调者在正常工作的前提下,并且收到了所有参与者的ACK响应,那么将会状态会从预提交转换到提交状态
这是 第三阶段的正常完成情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtpAKZa9-1585147625918)(https://donkeyx.top/upload/2020/3/3PC-doCommit-abort-c532b021e5ba42df83af8d2f315261db.png)]
进入该阶段的条件同preCommit的中断事务一样,只有协调者收到任何一个参与者的NO反馈或者等待超时后仍无法收到所有参与者的响应
这里的NO反馈,指的是doCommit阶段的NO反馈,意味着有参与者没有完成事务提交。
进入了阶段三,无论是协调者出现问题还是协调者与参与者之间出现网络故障,参与者都会在等待超时之后自动进行事务提交
3PC优点是降低了2PC的阻塞范围,且避免了单点问题。