Thresh
Undo:意为撤销或勾销,以撤销操作为目标,返回指定某个状态的操作。
Undo Log
数据库事务开始之前,会将要批改的记录寄存到 Undo 日志里,当事务回滚时或者数据库解体时,能够利用 Undo 日志,撤销未提交事务对数据库产生的影响。
Undo Log 产生和销毁
Undo Log 在事务开始前产生;事务在提交时,并不会立即删除 undo log,innodb 会将该事务对应的 undo log 放入到删除列表中,前面会通过后盾线程 purge thread 进行回收解决。
Undo Log 属于逻辑日志,记录一个变动过程。例如执行一个 delete,undolog 会记录一个 insert;执行一个 update,undolog 会记录一个相同的 update。
Undo Log 存储
Undo log 采纳段的形式治理和记录。在 innodb 数据文件中蕴含一种 rollback segment 回滚段,外部蕴含 1024 个 undo log segment。能够通过上面一组参数来管制 Undo log 存储。
show variables like '%innodb_undo%';
Undo Log 作用
实现事务的原子性
Undo Log 是为了实现事务的原子性而呈现的产物。事务处理过程中,如果呈现了谬误或者用户执行了 ROLLBACK 语句,MySQL 能够利用 Undo Log 中的备份将数据恢复到事务开始之前的状态。
实现多版本并发管制(MVCC)
Undo Log 在 MySQL InnoDB 存储引擎中用来实现多版本并发管制。事务未提交之前,Undo Log 保留了未提交之前的版本数据,Undo Log 中的数据可作为数据旧版本快照供其余并发事务进行快照读。
事务 A 手动开启事务,执行更新操作,首先会把更新命中的数据备份到 Undo Buffer 中。事务 B 手动开启事务,执行查问操作,会读取 Undo 日志数据返回,进行快照读