MySQL事务执行回滚操作时是否会生成对应的redo log?
MySQL执行rollback时是否会写入redo log?
我们知道,执行update语句时,mysqld会修改data page并写入redo log;执行commit语句时,redo log会被写入到文件中。如果我们不执行commit而是执行rollback,mysqld会将data page改回之前的状态,此时是否会写入redo log?
答案是会写入,具体逻辑如下:
- redo log的核心作用是保障数据库页修改的持久性,支撑崩溃恢复流程。不管是事务正向操作产生的页修改,还是回滚操作产生的页修改,本质都是对缓冲池内的页做了变更,都需要通过redo log记录来避免崩溃后变更丢失。
- 执行update操作时,除了修改数据页生成正向redo log外,还会生成用于回滚的undo log,而undo log本身的修改也会对应生成redo log保障持久化。
- 执行rollback时,MySQL会读取undo log的内容,反向修改数据页恢复到修改前的状态,这个反向修改本身属于数据页的变更,会生成对应的redo log写入,和普通update操作的redo log写入逻辑没有差异。
- 可以通过极端场景验证:如果回滚操作不写redo log,回滚到一半时数据库突然崩溃,重启后无法感知已经完成的回滚变更,就会出现数据不一致的问题。
- 补充常见误区:redo log和事务是否提交没有必然绑定关系,所有对数据库内存页(包括数据页、undo页等系统页)的修改,都会生成对应的redo log。
内容的提问来源于stack exchange,提问作者Drink Man
相关产品推荐
相关产品推荐

