事务的实现

2020-05-09  本文已影响0人  lsh的学习笔记

undo不是redo的逆过程。

redo和undo的作用都可以视为是一种恢复操作

redo 恢复提交事务修改的操作;
undo 回滚行记录到某个特定版本

因此两者记录的内容不同:
redo通常是物理日志,记录的是的物理修改操作;
undo是逻辑日志,根据每记录进行记录。

redo(重做日志)

用来实现事务的持久性,即事务ACID中的D。

记录了事务的行为,可以很好地通过其对页进行“重做”操作。

由两部分组成:
一是内存中的重做日志缓冲(redo log buffer),其是易失的;
二是重做日志文件(redo log file),其是持久的。

InnoDB是事务的存储引擎,其通过Force Log at Commit机制实现事务的持久性,即当事务提交(COMMIT)时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的COMMIT操作完成才算完成。

在InnoDB存储引擎中,重做日志都是以512字节进行存储的。这意味着重做日志缓存、重做日志文件都是以块(block)的方式进行保存的,称之为重做日志块(redologblock),每块的大小为512字节

由于重做日志块的大小和磁盘扇区大小一样,都是512字节,因此重做日志的写入可以保证原子性,不需要doublewrite技术。

undo

事务有时需要进行回滚操作,这时就需要undo。

undo存放在数据库内部的一个特殊段(segment)中,这个段称为undo段(undo segment)。undo段位于共享表空间内。

当InnoDB存储引擎回滚时,它实际上做的是与先前相反的工作。

  1. 对于每个INSERT,InnoDB存储引擎会完成一个DELETE;
  2. 对于每个DELETE,InnoDB存储引擎会执行一个INSERT;
  3. 对于每个UPDATE,InnoDB存储引擎会执行一个相反的UPDATE,将修改前的行放回去。
上一篇 下一篇

猜你喜欢

热点阅读