【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制

什么是 MVCC

MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制,是现代数据库(包括 MySQL、Oracle、PostgreSQL 等)引擎实现中常用的处理读写冲突的手段,目的在于提高数据库高并发场景下的吞吐性能。

如此一来不同的事务在并发过程中,SELECT 操作可以不加锁而是通过 MVCC 机制读取指定的版本历史记录,并通过一些手段保证保证读取的记录值符合事务所处的隔离级别,从而解决并发场景下的读写冲突。

先来了解一下什么是版本链:
【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第1张图片
几次执行的对应事务:
【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第2张图片
【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第3张图片

什么是ReadView

ReadView阅读视图,是“快照读”sql执行的时MVCC提取数据的依据,快照读就是普通的sql查询语句,当前读是指执行下面语句时的执行方式
【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第4张图片

【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第5张图片

MVCC如何实现RC和RR

RC,RR基于MVCC(多版本并发控制)进行并发事务控制,MVCC是基于“数据版本”对并发事务进行访问

实现RC(读已提交)

在每次快照读的时候都会产生新的ReadView
【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第6张图片
然后根据判断规则进行判断是否可以访问数据:
【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第7张图片
我们可以依次来分析一下

姓名 事务id 等于creator_id? trx_id < min_trx_id? trx_id > max_trx_id? min_trx_id < trx_id < max_trx_id 并且不在m_ids集合
张老三 3 × × × ×
张小三 2 × × × ×
张三 1 ×

由此可见,张三可以访问

但是读已提交为什么没有完成可重复读,因为在每次读的时候都会产生新的ReadView,当第一次产生的时候张小三还没有提交,但是第二次查询的时候生成ReadView已经提交,这时候就是:一个事务里面两次查询得到了不同的结果,就违背了可重复读。

实现RR(可重复读)

来看下RR是如何解决不可重复读的。

RC是在每次快照读的时候都会产生新的ReadView,而RR是仅在第一次快照读的时候生成ReadView,后序快照读复用,这样就解决了不可重复读的问题
【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第8张图片

但是还没有解决幻读的问题(第一次读之后又新增了数据导致读出来的数据不同)

读的时候又分为当前读快照读
快照读是由mvcc负责的,因为RR不管你读几次,都会是读的同一个Readview,所以每次读取都是相同的数据。
当前读是由Innodb的锁去解决的,间隙锁,第一次查出来的数据给这些数据上间隙锁,锁住读出来的数据,别人也不能插数据了,这样就解决了幻读的问题。
【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制_第9张图片

mysql默认的隔离级别是RR,是默认开启间隙锁的,所以在mysql的innodb引擎中是默认解决这个幻读的问题的。

你可能感兴趣的:(mysql高级以及sql优化,常见技术点源码剖析及其原理,mysql,mvcc)