MVCC
MVCC
什么是锁
当多个用户线程修改共享变量时,可以给修改操作上锁
什么是MVCC
MVCC全称是Multi-version Concurrency Control,即多版本并发控制,MVCC是一种并发控制的方法,一般用在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存
MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读
什么是当前读和快照读
Mysql InnoDB下的当前读和快照读
-
当前读
select lock in sshare mode(共享锁),select for update; update,insert,delete(排他锁)这些操作都是一种当前读
为什么叫当前读,因为它读取的记录是最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁
-
快照读
像
不加锁
的select操作就是快照读,即不加锁的非阻塞读,快照读的前提是隔离界别不是串行级别,串行级别下的快照读会退化成当前读。之所以会出现快照读,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,在很多情况下避免了加锁的操作,降低了开销。因为MVCC是基于多版本并发控制,因此快照读读到的不一定是最新版本,而有可能是之前的历史版本
MVCC就是为了实现读-写冲突不加锁,这个读指的是快照读,而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现。
正好之前学到了悲观锁,这里再插入一下悲观锁和乐观锁的知识
悲观锁:
在关系数据库管理系统里,悲观并发控制(又称“悲观锁”,Pessimistic Concurrency Control,缩写PCC)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据,如果一个事务的操作读某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。(太变态了)
悲观并发控制主要用于数据争用激烈的环境中,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本环境中。
下面开始说人话:
简而言之悲观锁住要用于保护数据的完整性,点那个多个事务并发执行时,某个事务对数据应用了锁,其他事务职能等待该事务执行完了,才能对该数据进行修改操作
- 准确的说,MVCC多版本并发控制指的是维持一个数据的多个版本。使得读写没有冲突,这么一个概念,仅仅是一个理想概念
- 在Mysql中想要实现MVCC的理想概念,需要Mysql提供具体的功能去实现它,快照读就是MySQL为我们实现MVCC理想模型的其中一个具体非阻塞功能,相对而言,当前读就是悲观锁的具体实现。
- MVCC模型在MySQL中的具体实现是由3个隐式字段实现的,undo日志、Read View等去完成的,具体看下面的MVCC实现原理
应用场景
读-读 不存在任何问题,也不需要并发控制
读-写 有线程安全问题,也会造成事务隔离隔离性问题,可能遇到脏读,幻读,不可重复读
写-写 有线程安全问题,回去更新丢失问题,比如第一类更新丢失,第二类更新丢失
MVCC带来的好处是?
多版本并发控制(MVCC)是一种用来解决读-写
冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该书屋开始前的数据库快照,所以MVCC可以解决如下问题
- 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写性能
- 同时还可以解决脏读、幻读、不可重复读等事务隔离问题,但是不能解决更新丢失问题