2PC
2PC,Two-Phase Commit,二阶段提交。
阶段一(事务请求、执行)
- 事务询问
协调者询问各参与者是否准备好开始事务。 - 执行事务
各参与者节点执行事务操作,并将Undo与Redo信息记录到日志里面。 - 各参与者向协调者反馈事务询问的响应
如果所有的参与者反馈都是ok,则会在第二阶段进行提交事务。如果任何一个参与者反馈是失败的,那么第二阶段将对事务进行回滚。
阶段二(提交事务或回滚)
各参与者都回复ok(提交事务):
- 发送提交请求
协调者向各参数者发送事务可以进行提交的请求 - 事务提交
各参与者进行事务的提交 - 反馈事务提交结果
各参与者发送事务提交的结果给协调者 - 完成事务
协调者收到各参数者的反馈信息,完成事务
有任何一个参数与回复失败(中断事务):
- 发送回滚请求
协调者向所有参与者节点发送Rollback的请求 - 事务回滚
各参与者进行事务的回滚 - 反馈事务回滚结果
各参与者将回滚的结果(ACK 消息)反馈给协调者 - 中断事务
协调者收到所有参与者的ACK消息,完成事务的中断
优缺点
优点:原理简单,实现方便。
缺点:
- 同步阻塞
在二阶段提交的执行过程中,其他节点都在等待事务的完成,直到最后一个节点反馈完信息,才算完成事务。所有节点都无法进行其他操作,直到事务完成。 - 单点问题
只有一个协调者,如果协调者出现了问题,事务就无法进行下去。如果在过程中发生故障,则会造成数据不一致的问题。 - 数据不一致
- 太过保守
没有完善的容错机制,一个发生错误则会导致所有的事务全部失败。
3PC
3PC对于2PC的最主要的阻塞的缺点进行了改进,将二阶段拆解成了2个部分(预提交、提交)。
阶段一:CanCommit
- 事务询问
- 各参与者反馈询问的响应
与2PC一样,有失败就进行回滚,否则进行预提交。
阶段二:PreCommit
执行事务预提交:
- 发送预提交请求
- 事务预提交
- 各参与者向协调者反馈事务执行结果
中断事务:
- 发送中断请求
- 中断事务
阶段三:doCommit
执行提交:
- 发送提交请求
- 事务提交
- 反馈事务提交结果
- 完成事务
中断事务:
- 发送中断请求
- 事务回滚
- 反馈回滚结果
- 中断事务
三阶段会出现单点问题,或者是 协调者和参与者之间存在网络故障。遇到以上问题,参与者们如果等待超时了还是会继续完成事务的提交。
优缺点:
优点:相对于2PC,3PC降低了阻塞的范围,并且能够在出现单点问题的时候还行保持一致性。
缺点:在第三阶段的时候,出现单点问题还是会出现数据不一致的问题。
PAXOS
同2PC一样存在,2个阶段。里面涉及到的有3个角色。
1.Proposer 2.Acceptor 3.leaner
阶段一:
- Proposer
prepare
一个提案(编号为Mn)给一个成员超过半数的Acceptor子集 - 一个Acceptor收到编号 (Mn)的提案,如果已有编号中没有编号超过Mn的,则会接受Mn并返回已有编号中最大的value值(v0)。(Acceptor 里面保存的可以看成是「编号:value值」这样的形式),同时承诺
promise
不会接受比Mn小的编号请求。
阶段二:
- Proposer收到来自半数以上的Acceptor对其的响应,则会发送一个
Accepte
请求并附上[Mn,v0]。如果acceptor里面没有任何值,v0值则是就是任意值。 - 如果Acceptor还没有对比编号Mn还大的
prepare
请求作出响应的话,则会通过[Mn,v0]方案。