二阶段提交与三阶段提交
二阶段提交
二阶段提交:(英语:Two-phase Commit)是指,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。
第一阶段(请求阶段):
提交请求阶段(Commit Request Phase),协调者发送请求给参与者,通知参与者提交或取消事务,参与者进入投票过程,每个参与者回复给协调者自己的投票:同意(事务在本地执行成功)或取消(事务本地执行失败)。
第二阶段(提交阶段):
提交阶段(Commit Phase),协调者对上一阶段参与者的投票结果进行表决,当所有投票为“同意”时提交提交事务,否者中止事务,并通知参与者,参与者接到通知后执行相应的操作。
二阶段提交协议的缺点
同步阻塞:在执行过程中,所有节点都是事务阻塞的,第三方资源都处于阻塞状态。
单点故障:一旦协调者出现故障,参与者会一直阻塞下去。
数据不一致:但协调者发出commit请求之后,部分参与者发生故障,这会导致只有部分参与者接收到commit请求,其他故障参与者未接收到请求,于是整个分布式便出现数据不一致的现象。
三阶段提交
三阶段提交(Three-phase commit),也叫三阶段提交协议(Three-phase commit protocol),是二阶段提交(2PC)的改进版本。
与两阶段提交不同的是,三阶段提交有两个改动点。
1、引入超时机制。同时在协调者和参与者中都引入超时机制。
2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
也就是说,除了引入超时机制之外,3PC把2PC的准备阶段
三阶段提交协议的缺点
如果进入PreCommit后,Coordinator发出的是abort请求,假设只有一个Cohort收到并进行了abort操作,
而其他对于系统状态未知的Cohort会根据3PC选择继续Commit,此时系统状态发生不一致性。