MVCC(Multiversion concurrency control)

Posted 软件工程小施同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVCC(Multiversion concurrency control)相关的知识,希望对你有一定的参考价值。



情景模拟:

在高并发的前提下,一定要注意这个前提。

事务L1修改某表中D的key值,还未提交;

事务L2同样也修改D的key值,提交;然后L1提交。

发生了什么?

L1从D读取key:123对应的值100

L2从D读取key:123对应的100

L1对值增加1,将key:123更新为100 + 1

L2对值增加2,将key:123更新为100 + 2

如果L1和L2串行执行,key:123对应的值将为103,但上面并发执行中L1的执行效果完全被L2所覆盖,实际key:123所对应的值变成了102。就因为L1事务没提交呢,L2又来了。

那如何处理呢?

方法一:

加锁呗。前边不都是在说这个锁的问题呢,把他加写锁,等L1执行完再执行L2。可以是可以,但是发生了排队,并发下降了。这是一种悲观一般把基于锁的并发控制机称成为悲观机制。

方法二:

为了实现可串行化,同时避免锁机制存在的各种问题,我们可以采用基于多版本并发控制(Multiversion concurrency control,MVCC)思想的无锁并发机制,终于把要说的引出来了!人们一般把基于锁的并发控制机称成为悲观机制(悲观锁),而把MVCC等机制称为乐观机制(乐观锁)。加入版本号的一个机制,由D维护该版本号,每次数据有更新就增加版本号,通过版本号来更加高效的管理事务一致性与高并发的问题。


因为锁机制是一种预防性的,读会阻塞写,写也会阻塞读,当锁定粒度较大,时间较长是并发性能就不会太好;

而MVCC是一种后验性的,读不阻塞写,写也不阻塞读,等到提交的时候才检验是否有冲突,由于没有锁,所以读写不会相互阻塞,从而大大提升了并发性能。

mysql-各种锁区分与MVCC的详解-mysql教程-php中文网mysql的锁貌似有很多啊,查了大部分资料,什么表锁,行锁,页锁共享锁,排他锁,意向锁,读锁,写锁悲观锁,乐观锁。。我去,真想问一句,有没有 金锁?我还范冰冰呢。。。哎呀怎么感觉好乱啊。那么把它好好整理总结下吧。后边还有对在innodb下的mvcc理解与举例,简单易懂了解下。表/行/页-锁:表级锁(table-level locking):Mhttps://www.php.cn/mysql-tutorials-354511.html

以上是关于MVCC(Multiversion concurrency control)的主要内容,如果未能解决你的问题,请参考以下文章

Lecture#18 Multi-Version Concurrency Control

用multiversion java运行Hadoop

MySQL高级-MVCC(超详细整理)

CAS

MySQL的MVCC底层原理

3什么是MVCC