undo log是用来解决事务的原子性的,事务的原子性的实现就要依赖于undo log日志。
undo log也称为回滚日志,用于记录数据被修改前的信息。简单来说就是:当我们执行一条update语句的时候,那么在undo log里面将会记录这条语句在更新之前长什么样。
作用包含两个 : 提供回滚(保证事务的原子性) 和 MVCC(多版本并发控制) 。
undo log和redo log记录物理日志不一样,它是逻辑日志,物理日志主要记录的是:这个数据里面的内容是什么样子的,而undo log记录的是每一步执行的是什么样的操作。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的 update记录。
相反:当你执行一条update,undo log里面记录的就是执行update之前的这条数据长什么样子。
当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚,这样就保证了事务的原子性。
undo log主要的作用,第一个就是用于数据回滚的,一旦我们事务提交或者事务回滚了,那这份undo log实际上也就不需要了。但是!
Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。
Undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的 rollback segment 回滚段中,内部包含1024个undo log segment。
之前讲解段的时候,提到了有一个段叫回滚段,undo log就存放在回滚段中。