-
隔离性
由锁
来实现。 -
原子性
和持久性
由redo log(重做日志)
来保证。 -
一致性
由undo log
来保证。
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存储引擎回滚时,它实际上做的是与先前相反
的工作。
- 对于每个INSERT,InnoDB存储引擎会完成一个DELETE;
- 对于每个DELETE,InnoDB存储引擎会执行一个INSERT;
- 对于每个UPDATE,InnoDB存储引擎会执行一个相反的UPDATE,将修改前的行放回去。
网友评论