一篇文章带你拿下MySQL两阶段提交!

  MySQL中两阶段提交主要指的是redo log的两阶段提交,两阶段提交是为了解决在MySQL主从架构下,由redo logbin log不同步而导致主从机数据不一致问题。

两阶段提交的流程图如下(图源在文末链接):

一篇文章带你拿下MySQL两阶段提交!_第1张图片
  这样直接看流程图,并不能直观的感受到两阶段提交的作用,我们分两步来理解两阶段提交起到的作用。

第一步:没有两阶段提交会发生什么?

  在没有两阶段提交的情况下,事务对redo logbin log的写入顺序为:

  • 1、事务执行过程中,写入redo log
  • 2、事务完成后,写入bin log

  问题非常明显,如果在第二步执行时,MySQL宕机了,那么就会出现redo log中显示事务已经提交了,而bin log中并不存在对应的事务信息。
  此时,MySQL主机通过redo log恢复,MySQL从机通过bin log恢复,这就导致了MySQL主从架构下,主从机数据不一致的问题

第二步:两阶段提交是如何解决这个问题的?

  两阶段提交将redo log的提交拆分为两次提交,此时事务对redo logbin log的写入顺序为

  • 1、事务执行过程中,写入redo log并标记redo logprepare阶段
  • 2、事务完成后,写入bin log
  • 3、写完bin log后,标记redo logcommit阶段

  在这样的顺序下,即使在第二步执行时,MySQL宕机了,MySQL主机在恢复时,会有三种情况:

  • 1、redo log的状态为commit,代表bin log也成功写入了,则提交事务
  • 2、redo log的状态为prepare,但bin log中存在对应的事务信息,依旧提交事务
  • 3、redo log的状态为prepare,并且bin log中不存在对应的事务信息,则回滚事务。

可以看到,两阶段提交成功保证了MySQL主从机的数据一致性。

总结

  所有的知识,在你真正理解之前都会觉得很难啃,等你理解了,就会发现,不过如此,加油!!!

参考:

MySQL 为什么需要两阶段提交?

你可能感兴趣的:(mysql,数据库,java)