@TOC
1. MVCC是什么
MVCC是面试中比较常见的一个问题,那么什么是MVCC机制,它的作用是什么?
它的英文全称是 Multi-Version Concurrency Control ,也就是“多版本并发控制”的意思。在MySQL InnoDB存储引擎下,RC、RR就是基于MVCC进行事务并发控制。
RC:Read Commited,读已提交
RR:Repeatable Read,可重复读
MVCC的实现方式是:基于“数据版本”对事务并发进行访问。
2. RC、RR查询数据时的结果分析
对于上面的两个查询语句,RC和RR读取的数据区别:
RC:select1——>“张三”,select2——>“张小三”
RR:select1——>“张三”,select2——>“张三”
那么,这两种隔离级别时怎么实现的呢?见下面。
3. 不同隔离级别的实现方式
3.1 UNDO_LOG版本链
首先,InnoDB会创建一个UNDO_LOG版本链的,来记录某条数据各个的版本:
TRX_ID:完成数据操作的事务编号
DB_ROLL_PTR:指向上一版本的数据信息
3.2 ReadView
“快照读” 就是最普通的Select查询SQL语句。
“当前读” 指代执行以下查询语句时进行数据读取的方式:
insert,update,delete
select … for updata
select … lock in share mode
ReadView是 “快照读” SQL执行MVCC提取数据的依据,它是一个数据结构,包含4个字段:
3.3 RC的实现方式
两次次查询时,都会生成一个新的ReadView,来实现读已提交
然后根据ReadView判断那个版本的数据符合要求
第二个ReadView同理。
3.4 RR的实现方式
两次查询时,第二个会沿用上一个 ReadView,从而解决不可重复读的问题。
然后根据ReadView判断那个版本的数据符合要求
由于在RR中,ReadView是复用的,所以两次读取的数据一样。
3.5 RR隔离级别下,使用MVCC可以避免幻读吗
答案是:能,但不完全能!
连续多次 快照读 ,ReadView会产生复用,没有幻读问题。但是:当两次快照读之间存在当前读,ReadView就会重新生成,导致幻读。
4. MVCC的特点
- 允许多个版本同时存在,并发执行。
- 不依赖锁机制,性能更高。
- 只在读已提交和可重复读的事务隔离级别下使用。