2PC Two-Phase-Commit 二阶段提交
协调者:Coordinator 统一调度所有分布式节点的执行逻辑
参与者:Participant 被调度的分布式节点
阶段一:提交事务请求(投票阶段)
1、事务询问。
协调者像所有参与者发送事务内容,等待参与者响应
2、执行事务。
参与者执行事务,记录UNDO和REDO信息(用于回滚)
3、各参与者向协调者事务询问的响应。
如果参与者执行成功返回yes,失败返回no
阶段二:执行事务提交
如果协调者得到都是yes
1、发送提交请求
发送commit给各参与者
2、事务提交
参与者收到commit请求之后,执行事务提交,释放事务资源
3、反馈事务提交结果
参与者反馈ACK给协调者
4、完成事务
协调者收齐所有ACK,完成事务
如果协调者收到no或者某参与者超时
1、发送回滚请求
协调者发送rollback请求给众参与者
2、事务回滚
参与者收到rollback,通过记录中的UNDO信息,执行回滚,完成后释放事务资源
3、反馈事务回滚结果
参与者完成rollback,向协调者发送ACK
4、中断事务
协调者集齐所有ACK消息后,完成事务中断。
优点:原理简单,实现方便
缺点:
- 同步阻塞
二阶段提交执行过程中,所有参与该事务操作的逻辑都处于阻塞状态 - 单点问题
协调者单点,如果出现问题,则参与者会被锁定 - 数据不一致
阶段二,步骤2中,协调者发送commit请求时,如果发现局部网络异常或者协调者未发送完commit请求之前奔溃,导致部分参与者收到commit,其他参与者无法提交事务,导致整个分布式系统出现数据不一致 - 太过保守
任意节点的失败会导致整个事务失败