分布式事务3PC

3PC Three-Phase-Commit 二阶段提交

分为三步:CanCommit、PreCommit和do Commit

阶段一:CanCommit

1、事务询问
协调者向参与者发送包含事务内容的canCommit请求
2、各参与者向协调者反馈询问的响应
参与者根据自身状态反馈yes或no

阶段二:PreCommit

协调者集齐yes
1、发送预提交请求
协调者给各参与者发送preCommit请求,进入prepared阶段
2、事务预提交
参与者接收到preCommit,执行事务,将UNDO和REDO信息记录到事务日志中
3、各参与者向协调者反馈事务执行的响应
参与者反馈ACK

协调者收到no
1、发送中断请求
协调者发送abort
2、中断事务
参与者收到abort或者在阶段一或二中超时,都会中断事务

阶段三:do Commit

协调者收到所有ack
1、发送提交请求
协调者收到所有ack,给所有参与者发送doCommit请求
2、事务提交
参与者接收到doCommit请求后,正式执行事务提交,是否事务资源
3、反馈事务提交结果
参与者反馈ACK消息
4、完成事务
协调者收到所有ACK消息,完成事务

中断事务(二阶段收到no,或者等待超时,没集齐二阶段的ACK)
1、发送中断请求
协调者向所有参与者发送abort
2、事务回滚
参与者收到abort,利于UNDO信息回滚事务,释放资源
3、反馈事务回滚结果
参与者反馈ACK
4、中断事务
协调者集齐所有ACK,中断事务

进入阶段三可能会遇到两种情况

  • 协调者崩溃
  • 网络故障

无论出现哪种情况,最终参与者都收不到doCommit和abort请求,这时,参与者在等待超时后,会继续进行事务提交

优点:解决2PC的单点故障影响整个系统问题

缺点:参与者超时后会继续提交事务,会出现数据不一致性

推荐阅读更多精彩内容