1. Undo Log 介绍
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%';
2. Undo Log 作用
- 实现事务的原子性
Undo Log
是为了实现事务的原子性而出现的产物。事务处理过程中,如果出现了错误或者用户执行了ROLL BACK
语句,MySQL
可以利用Undo Log
中的备份将数据恢复到事务开始之前的状态。 - 实现多版本并发控制(
MVCC
)
Undo Log
在MySQL InnoDB
存储引擎中用来实现多版本并发控制。事务未提交之前,Undo Log
保存了未提交之前的版本数据,Undo Log
中的数据可作为数据旧版本快照供其他并发事务进行快照读。
- 事务
A
手动开启事务,执行更新操作,首先会把更新命中的数据备份到Undo Buffer
中 - 事务
B
手动开启事务,执行查询操作,会读取Undo
日志数据返回,进行快照读