前言
大家好,我是fancy呀。
在上一篇关于MySQL的文章中,我讲到了事务的特性、隔离级别和并发一致性问题。其中我们说到了数据库的四个隔离级别,并说明MVCC是实现了提交读,可重复读的重要手段。
MVCC也是MySQL数据库中一个老生常谈的话题了,但是由于它较为底层,实际的开发日常中我们并不会去直接接触它,所以真正将它弄明白的人并不多,许多面试者,提到它很多人都处于:“哦,这个东西我知道!是数据库中的一种并发措施,但是我有点忘记了它的详细内容了...”这样的状态。
所以本篇文章,就来详细讲一讲”MVCC”,带大家理清楚MVCC的内容。
话不多说,列大纲,发车!
什么是MVCC?
MVCC((Mutil-Version Concurrency Control)),全称多版本并发访问,这是一种并发环境下进行数据安全控制的方法,其本质上是一种乐观锁,用于实现提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别。在这里我先为大家理清楚一个概念:我们常说的MVCC是由MySQL数据库InnoDB存储引擎实现的,并非是由MySQL本身实现的,不同的存储引擎,对MVCC都有不同的实现标准。所以当你在面试官面前说:”MySQL使用了MVCC实现了xxxxxx“,面试官一下子就把你给逮住了,说明你连MySQL和InnoDB之间的关系都模糊不清。
那么,当你听到了“多版本”、“并发访问”这两个词,你也许就知道了,InnoDB使用MVCC来解决并发问题的方法,就是让每个不同的事务访问查询同一行数据时,每个事务修改的都是这行数据的不同版本,InnoDB只需要去记录这个数据的访问链,就可以实现一个SELECT操作的并发执行。
那么,它具体是如何实现的呢?
MVCC利用了多版本的思想,在 MVCC 中事务的所有写操作(INSERT、UPDATE、DELETE)会为数据行新增一个最新的版本快照,而读操作是去读旧版本的快照,也就是说,读操作和写操作是分离的,二者之间没有依赖、互斥关系。
核心
Undo Log
什么是Undo Log?
Undo Log是MySQL的三大日志之一,当我们对记录做了变更操作时就会产生一条Undo记录。它的作用就是保护事务在异常发生的时候或手动回滚时可以回滚到历史版本数据,能够让你读取过去某一个时间点保存的数据。通俗易懂地说,它只关心过去的数据。
本文我们不会对Undo Log的作用做太多描述,你需要重点知道的是:对于一个InnoDB存储引擎,一个聚簇索引(主键索引)的记录之中,一定会有两个隐藏字段trx_id和roll_pointer,这两个字段存储于B+树的叶子节点中,分别对应记录着两列信息:
trx