分布式一致性协议 之 两阶段提交协议(2PC)
文章目录
1、两阶段提交协议
两阶段提交协议,简称2PC(2 Prepare Commit),是比较常用的解决分布式事务问题的方式,要么所有参与进程都提交事务,要么都取消事务,即实现ACID中的原子性(A)的常用手段。
分布式事务: 事务提供一种操作本地数据库的不可分割的一系列操作 “要么什么都不做,要么做全套(All or Nothing)”的机制,而分布式事务就是为了操作不同数据库的不可分割的一系列操作 “要么什么都不做,要么做全套(All or Nothing)”的机制
2、2PC执行流程
1. 成功执行事务事务提交流程
阶段一:
事务询问协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
执行事务 (写本地的Undo/Redo日志)
各参与者向协调者反馈事务询问的响应
阶段二:
发送提交请求:协调者向所有参与者发出 commit 请求。
事务提交:参与者收到 commit 请求后,会正式执行事务提交操作,并在完成提交之后释放整个事务执行期间占用的事务资源。
反馈事务提交结果:参与者在完成事务提交之后,向协调者发送 Ack 信息。
完成事务:协调者接收到所有参与者反馈的 Ack 信息后,完成事务。
2. 中断事务流程
假如任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈响应,那么就会中断事务
阶段一:
事务询问协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
执行事务 (写本地的Undo/Redo日志)
各参与者向协调者反馈事务询问的响应
阶段二:
发送回滚请求:协调者向所有参与者发出 Rollback 请求。
事务回滚:参与者接收到 Rollback 请求后,会利用其在阶段一中记录的 Undo 信息来执行事务回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源。
反馈事务回滚结果:参与者在完成事务回滚之后,向协调者发送 Ack 信息。
中断事务:协调者接收到所有参与者反馈的 Ack 信息后,完成事务中断。
3、2PC 优点缺点
优点:原理简单
缺点:
同步阻塞:在二阶段提交的执行过程中,所有参与该事务操作的逻辑都处于阻塞状态,即当参与者占有公共资源时,其他节点访问公共资源会处于阻塞状态
单点问题:若协调器出现问题,那么整个二阶段提交流程将无法运转,若协调者是在阶段二中出现问题时,那么其他参与者将会一直处于锁定事务资源的状态中,而无法继续完成事务操作
数据不一致:在阶段二中,执行事务提交的时候,当协调者向所有的参与者发送Commit请求之后,发生了局部网络异常或者是协调者在尚未发送完Commit请求之前自身发生了崩溃,导致最终只有部分参与者收到了Commit请求,于是会出现数据不一致的现象。
太过保守:在进行事务提交询问的过程中,参与者出现故障而导致协调者始终无法获取到所有参与者的响应信息的话,此时协调者只能依靠自身的超时机制来判断是否需要中断事务,这样的策略过于保守,即没有完善的容错机制,任意一个结点的失败都会导致整个事务的失败。