InnoDB的MVCC机制

MVCC全称为:Multiple Version Concurrency Control,即多版本并发控制。这是一种既保证数据一致性,又保证高并发性能的机制。即一行数据可能存在多个版本,每个事务看见的版本不一样。 MVCC在InnoDB中是通过隐藏列和Undo日志来实现的。

隐藏列

对于数据库中的每一行数据,其实除了我们可以看见的列以外,还有另外三个列:DB_TRX_IDDB_ROLL_PTRDB_ROW_ID

undo log

undo log分为insert undo log和update undo log。undo log存储在共享表空间的rollback segment中。其存储的是一行数据的一个副本。 insert的undo log在事务提交后,直接删除,因为该记录只有这个记录可见, update的undo log在事务提交后,会有专门的purge thread去处理,因为,可能多个事务需要用到该日志来构建之前的数据。

DBROLLPTR指向的是undo log的地址,如果有多个版本的话,通过这个指针可以找到之前的版本。

MVCC的实现

为了实现一致性的读,InnoDB在每次读取操作时,会建立一个叫做read view的对象,里面包含三个值:up_limit_id low_limit_id trx_ids.

当一个事务读取数据时,对于每一行数据,通过其DBTRXID和uplimitid、lowlimitid进行判断,

注意,对于RR和RC生成read view的时机是不同的:

快照读/锁定读

一般的SELECT操作都是快照读,即读取的是数据的一个版本。锁定读,则是通过下面的几个语句实现: