为了进行mvcc(多版本并发控制)与回滚,innodb单独管理着undo空间(undo space、rollback segment)。
1)当执行update语句后,即使不执行commit,数据列也会在innodb缓冲池修改。但是innodb存储引擎无法确定用户执行update语句后,执行rollback操作还是commit操作。
因此为了应对用户可能rollback操作的情形,先要将修改之前的数据保存到undo日志。
2)当用户进行commit,缓冲池中变更的内容就会持久化。
3)当用户进行rollback,就会将保存在undo日志的旧数据还原。
innodb不会将缓冲池中的内容立即刷到数据文件,而是按照一定周期写入。所以,执行完(1)时,数据文件列值可能为新值,也可能为旧值。(若innodb的后台线程已经将记录写入数据文件,那么原值就会被更新为新值)
大量客户连接中的数据发生变化时,undo日志会积累许多变更前的信息,这些积累的信息必须在某时刻进行删除,留出足够空间来保存以后的变更内容,这个动作就是undo清理(undo purge)。mysql5.7的innodb,允许用户将innodb_purge_threads系统变量设置为大于1的值,这样就可以多个undo清理线程做清理工作。
redo持久化:
当执行DML语句时,变更的数据会先记录到重做(redo)日志,同时持久化到磁盘。
innodb存储引擎只在内存(innodb缓冲池)中更改实际数据表的数据,innodb会在某个时刻将仅在内存(innodb缓冲池)中更改的数据持久化到磁盘。