许吉友 - 运维

MVVC 多版本并发控制

MVCC(Multi-Version Concurrency Control多版本并发控制):

具体的DML:

为了提高并发度,InnoDb提供了这个「非锁定读」,即不需要等待访问行上的锁释放,读取行的一个快照即可。 既然是多版本读,那么肯定读不到隔壁事务的新插入数据了,所以解决了幻读。

快照读与当前读

在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。

快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。

当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录

在一个支持MVCC并发控制的系统中,哪些读操作是快照读?哪些操作又是当前读呢?以MySQL InnoDB为例:

MVVC 与间隙锁

MySQL 中在可重复读的隔离级别中解决了幻读。主要使用两种技术互相配合:MVVC 和 间隙锁。

MVVC 的意思是多版本并发控制,是一种乐观锁,间隙锁是悲观锁。

行锁和间隙锁组合起来就叫Next-Key Lock。

MVVC 中有快照读和当前读两种概念。

对于快照读来说,你随便读我不管你,反正你读的是历史数据,绝对不会出现幻读。

对于当前读来说,需要使用 Next-Key Lock,以实现对写数据进行阻止,防止出现幻读。

通过利用这两种方式,平衡了并发性能和数据安全。