事务的四大特性中,隔离性由锁实现。原子性、一致性、持久性通过数据库的Redo Log和Undo Log实现。

1、Redo Log

在前面的学习中,了解到重做日志分为两部分,一部分在缓冲池中:Redo Log Buffer,另一部分在物理磁盘:Redo Log File。
在事务提交时,会将事务所有的日志都写入重做日志文件进行持久化,其中日志既有redo log也有undo log。
redo记录的是页的物理修改操作,而undo是根据每行数据进行记录。

2、Undo Log

undo主要用于事务的回滚操作,保证事务的原子性与一致性,并提供MVCC功能。
在InnoDB中,Insert操作在事务提交之后,Undo Log会立即删除,因为新插入的数据没有历史版本;
对于Update和Delete操作,需要维护多版本信息,以实现MVCC。

3、MVCC例子

事务t1和t2同时访问数据A,t1要做更新操作,t2要做查询操作,假设t1获取了锁,t2并不会等待锁的释放,而是会去读取一个快照数据,由于历史版本数据存储在Undo页中,对数据的修改对于Undo页的读取没有影响,从而达到非一致性锁定读,提高了并发性。

对于Redo和Undo更详细的信息可以参考《MySQL运维内参》《MySQL技术内幕:InnoDB存储引擎》等书籍。

参考

MySQL · 引擎特性 · InnoDB redo log漫游
MySQL · 引擎特性 · InnoDB undo log
《MySQL技术内幕 InnoDB存储引擎 第二版》

tencent.jpg