简介
Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。
*往期知识不做重点
事务具有4个特征,分别是原子性、一致性、隔离性和持久性。
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。
引入
例题:在隔离级别为不可重复读、可重复读分别输出什么
1、RR级别:张三 张小三
2、RC级别:张三 张三
RR->RC Innodb做的事情
MySQL底层用链的方式存着版本链
两个重要名词
快照读:select * from xxx ,普通的sql语句
当前读:select * form xxx for update; delete ; insert into ; update
快照读下使用MVCC——解决不可重复读
undo log 版本链 + Read View 可见性规则
RR 隔离级别实现原理,就是 MVCC 多版本并发控制,而 MVCC 是通过 ReadView+
Undo Log 实现的,Undo Log 保存了历史快照,Read View 可见性规则帮助判断当
前版本的数据是否可见。
Undo Log 版本链长这样
不可重复读就是最上面图中,两次事务D的select语句,每次获取新的readView
可重复读就是最上面图,两次事务D的select语句,取相同的readView
当前读下使用间隙锁(或next-key-lock)——解决幻读问题
针对于索引区间的查询或者修改,Mysql 会自动对索引间隙加锁,来解决幻读问题。
1、执行语句
SELECT * FROM user WHERE id > 3 AND id<7 FOR UPDATE;
2、假设B+ Tree 的索引结构,这个结构中有四个索引元素分别是:1、3、7、10
加了间隙锁后(3,7),insert into xxx values (5,name)这个时候就无法插入了,要等上面的事务提交以后方能插入
3、当区间变为where id>3,那升级为next-key-lock,索引区间为(-∞,1],(1,3],(3,7],(7,10],(10,+∞]
所以用到了(3,7],(7,10],(10,+∞]