-
2PC 即 Two-Phase Commit,二阶段提交
-
2PC 分为两个阶段处理,阶段一:提交事务请求,阶段二:执行事务提交
-
如果阶段一超时或者出现异常,2PC 阶段二中断事务
-
阶段一:提交事务请求
- 事务询问,协调者向所有参与者发送事务内容,询问是否可以执行提交操作,并开始等待各参与者进行响应
- 执行事务,各参与者节点,执行事务操作,并将 undo 和 redo 操作计入本机事务日志;各参与者向协调者反馈事务问询的响应,成功执行返回 yes,否则返回 no
-
阶段二:执行事务提交
- 协调者在阶段二决定是否最终执行事务提交操作,这一阶段包含两种情形:
- 情形一:执行事务提交,所有参与者 reply yes,那么执行事务提交
- 发送提交请求,协调者向所有参与者发送 commit 请求
- 事务提交,参与者收到 commit 请求后,会正式执行事务提交操作,并在完成提交操作之后,释放在整个事务执行期间占用的资源
- 反馈事务提交结果,参与者在完成事务提交后,写协调者发送 ack 消息确认
- 完成事务,协调者在收到所有参与者的 ack 后,完成事务
- 情形二:中断事务,事情总会出现意外,当存在某一参与者向协调者发送 no 响应,或者等待超时,协调者只要无法收到所有参与者的 yes 响应,就会中断事务
- 发送回滚请求,协调者向所有参与者发送 rollback 请求
- 回滚,参与者收到请求后,利用本机 nndo 信息,执行 rollback 操作,并在回滚结束后释放该事务所占用的系统资源
- 反馈回滚结果,参与者在完成回滚操作后,向协调者发送 ack 消息
- 中断事务,协调者收到所有参与者的回滚 ack 消息后,完成事务中断
-
2PC 解决的是分布式数据强一致性问题
- 优点:实现原理简单
- 缺点:
- 性能问题:执行过程中间,节点都处于阻塞状态,各个操作数据库的节点此时都占用着数据库资源,只有当所有节点准备完毕,事务协调者才会通知进行全局提交,参与者进行本地事务提交后才会释放资源,这样的过程会比较漫长,对性能影响比较大。
- 协调者单点故障问题:事务协调者是整个 XA 模型的核心,一旦事务协调者节点挂掉,会导致参与者收不到提交或回滚的通知,从而导致参与者节点始终处于事务无法完成的中间状态
- 丢失消息导致的数据不一致问题:在第二个阶段,如果发生局部网络问题,一部分事务参与者收到了提交消息,另一部分事务参与者没收到提交消息,那么就会导致节点间数据的不一致问题