MVCC 涉及的概念
- MultiVersion Concurrency Control ,多版本并发控制技术。通过管理数据行的多个版本来解决并发安全问题的技术
- 通过锁的方式可以解决 Mysql 的并发访问问题,但有锁就会有系统开销,而且完全无法读写并发,还可能产生死锁问题
- MVCC 技术可以不加锁解决并发访问问题,降低系统开销,实现读写并发
快照读和当前读的概念
- 快照读:读取到的是在 readview ( 后面有说明 ) 的基础上当前事务对该 readview 的修改,普通 select 属于快照读
select ...
- 当前读:读取到的总是当前最新的数据,包含已提交的事务做出的更改,加锁的 select 、DML 语句属于当前读
select ... lock in share mode;
select ... for update;
insert ...; delete ...; update ...;
readview 的概念 :事务在进行某次快照读时同步生成的视图,也叫读视图。readview 中包含已提交的事务做出的更改
MVCC 的实现原理
- 首先,每张表都有这样几个隐藏字段
- DB_TRX_ID :创建或最后一次修改该记录的事务 id(每个事务都默认有一个 id )
- DB_ROW_ID :隐藏的主键
- DB_ROLL_PTR :回滚指针。当不同的事务修改同一条数据时,会使该记录的 undolog 形成一个链表,通过链表的头可以回滚为最新一次事务修改前的状态,后面依次是从新到旧的历史状态。回滚指针就指向这条链表。通过回滚指针可以找到指定事务开始前的数据状态。就可以通过这种方式还原某个 readview
- MVCC 只在 RC 和 RR 两个隔离级别下工作。区别在于生成 readview 的时机不同,RC 在每一次快照读时都会生成,而 RR 只在第一次快照读时生成
- RC 下使用 MVCC 解决了脏读问题;RR 下使用 MVCC 解决了不可重复读的问题,数据的可重复读其实就是 readview 的重复使用
- RR 下的 MVCC 没有完全解决幻读问题,其他事务插入提交后本事务对新插入数据做出更改也会体现在 readview 中,即出现了幻读问题。幻读问题还是需要使用间隙锁来解决