Mysql中的binlog、redolog、undolog
Mysql执行器在执行更新相关的语句时候,会记录日志
1. binlog 二进制日志
binlog是Mysql自带的日志模块(叫什么归档日志),所有引擎都可以使用
1. 发生时机(commit之前)
MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性
图片来源:JavaGuide链接 MySQL三大日志(binlog、redo log和undo log)
2. redolog 事务日志
redolog是InnoDB引擎自带的日志模块(重做日志),InnoDB就是通过redolog来保证事务操作的
使用 redo log(重做日志) 保证事务的持久性
比如 MySQL 实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。
图片来源:JavaGuide链接 MySQL三大日志(binlog、redo log和undo log)
3. undolog 回滚日志
在异常发生时,对已经执行的操作进行回滚
使用 undo log(回滚日志) 来保证事务的原子性。
4. InnoDB模式下的更新的sql执行流程:
- 先查询到张三这一条数据,如果有缓存就用缓存。
- 然后拿到查询的语句,把 age 改为19,然后调用InnoDB特点接口,写入这一行数据,InnoDB引擎把数据保存在内存中,同时记录redo log,此时redo log进入prepare状态,然后告诉执行器,执行完成了,随时可以提交。
- 执行器收到通知后记录binlog,然后调用引擎接口,提交redo log 为commit状态。
- 更新完成。
图片来源:JavaGuide链接 MySQL三大日志(binlog、redo log和undo log)
redo log 两阶段提交的方式(redo log的写入拆成了两个步骤prepare和commit),这就是两阶段提交,写完binglog后,然后再提交redo log(这里的二阶段提交和分布式事务解决方案的2PC有点区别)