事务的隔离性由锁来实现,原子性、一致性、持久性通过数据库的redo log和undo log来完成。 redo log称之为重做日志,用来保证事务的原子性和持久性。 undo log 用来保证事务的一致性。
redo log 和 undo log 的作用都可以视为一种恢复操作,redo log恢复事务修改的页操作,而undo log回滚行记录到某个特定版本。因此两者记录的内容不同,redo log通常是物理日志 记录页的物理修改操作,undo log是逻辑日志,根据每行记录进行记录。

redo

基本概念

重做日志用来实现事务的持久性,即事务ACID中的D,其由两部分组成: 一是内存中的重做日志缓冲(redo log buffer),它是容易丢失的,二是重做日志文件(redo log file) 它是持久的。

innoDB通过Force log at commit 机制实现事务的持久性, 即当事务提交时, 就会先将该事务的所有日志写入重做日志进行持久化, 由两部分组成 即redo log 和 undo log。redo log保证事务的持久性, 而undo log 用来帮助事务回滚及MVCC的功能。

写入文件保证机制。 为了确保每次日志都写入重做文件,在每次将重做日志缓冲写入重做日志文件后,innodb存储引擎都需要调用一次fsync操作。重做日志缓冲会先写入文件系统缓存,为了确保写入磁盘。必须进行一次fsync。

undo

基本概念

重做日志记录了事务的行为, 可以很好的通过其对页进行 “ 重做“ 操作。 但有时还要进行回滚操作, 这时需要undo log。 因此在对数据库进行修改时,innoDB存储引擎不但会产生redo, 还会产生一定量的undo。 如果事务或语句失败了, 又或者执行了rollback回滚, 就可以利用undo 将数据混滚到修改之前的样子。