相信大家多多少少都听过或者了解过MVCC,知道它大致是一个什么东西,但是想把它讲明白,讲清楚却不是那么容易。
首先我们先解析一下MVCC 的中文名称——多版本并发控制。这个词语我们可以拆分为两个部分来解读,一个是多版本,一个是并发控制;
首先多版本的意思就是,在数据库的每一行数据,它都可能存在多个版本;然后并发控制就是要从这多个版本中,选出某个适合当前操作的版本。
当前读和快照读
所谓的当前读就是在我们使用
select ... lock in share mode,select ... for update和insert、update、delete 等操作的时候读取的是数据的最新版本,当前读会对读取到的记录加锁。当前读是和锁息息相关的
快照读就是想要读取的行 正在执行 DELETE 或 UPDATE 操作,这时读取操作不会去等待行上锁的释放。相反地,会去读取行的一个快照数据(从多个版本中获取某一个版本的数据),这里的读取其实就是基于MVCC 的非阻塞读。
MVCC 的实现的核心
MVCC 的实现依赖于:隐藏字段、Read View、undo log。
隐藏字段
在内部,InnoDB 存储引擎为每行数据添加了两个 隐藏字段(其实是四个字段,但是这里MVCC机制一般只需要用到两个字段)