登录 |  注册
首页 >  数据库 · 存储 >  MySql实战精选笔记 >  MySQL数据库MVCC的概念

MySQL数据库MVCC的概念

什么是MVCC

MVCC(Multi-Version Concurrency Control 多版本并发控制),是一种不利用锁机制实现的隔离级别,主要实现了在保证数据的一致性的前提下,实现了读写的并行。从而大大提高数据库系统的并发性能。

数据库并发场景有三种,分别为:

  • 读-读:不存在任何问题,也不需要并发控制

  • 读-写:有线程安全问题,可能会造成事务隔离性问题

  • 写-写:有线程安全问题,可能会存在更新丢失问题

引入了MVCC技术可以为数据库解决以下问题

在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能.。同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题。 这样大幅度提高了并发度。这也是为什么现阶段,几乎所有的RDBMS(关系型数据库管理系统),都支持了MVCC。

MVCC如何实现

通过保存数据在某个时间点的快照来实现的,不管执行多长时间,每个事务在当前看到。操作的数据是一样的,

Ps:该操作解决了事务隔离级别中可重复读引起的幻读问题

根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据都可能是不一样的;典型的MVCC实现方式分为:乐观(optimistic)并发控制和悲观(pessimistic)并发控制。

在InnoDB中,通过在每行记录后面保存两个隐藏的列来实现的,这两个列一个保存了行的创建时间,一个保存行的过期时间(或删除时间),存储的不是时间值,而是系统的版本号;每开始一个新的事务,系统版本号都会自动递增,事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。

MVCC的操作方式

在Repeatable Read(可重复读)的隔离级别下MVCC的操作形式:

select: InnoDB会根据一下条件检查每行记录:

  • InnoDB只查找版本早于当前事务版本的数据行(行的系统版本号小于或等于当前事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始之前就已经存在的,要么是事务自身插入的或者修改过的。

  • 行的删除版本要么未定义,要么大于当前事务版本号。这样可以确保事务读取到的行,在事务开始之前未被删除

只有满足上述两个条件的记录,才能返回作为查询结果

insert

InnoDB为新插入的每一行保存当前系统版本号作为行版本号

delete

InnoDB为删除的每一行保存当前系统版本号作为行删除标识

update

InnoDB为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识

MVCC优缺点

    优点:保留额外的两个系统版本号,使得大多数操作都可以不用加锁,这样设计使得读数据操作很简单,性能很好,并能保证只会读取到符合标准的行。

    缺点:每行记录都需要额外的存储空间,并需要做更多的行检查工作和额外的维护工作。

MVCC作用域

MVCC只在Repeatable Read(可重复读)和Read Commited(读提交)两个隔离级别下工作,其他两个隔离级别都和MVCC不兼容,因为Read Uncommited(读未提交)总是读取最新的数据行,而不是符合当前事务版本的数据行。

Serializable(可串行化)则会对读取的行加锁

Ps:因为MVCC的实现方式没有统一的标准,存在的存储引擎和数据库系统的差异,因此不能说自己的实现方式是对的,其他的实现方式是错的。

上一篇: 什么是排他锁?什么是间隙锁?
下一篇: 面试: 为什么 MySQL 索引要使用 B+树而不是B 树?
推荐文章
  • mysql只支持一种join算法:Nested-LoopJoin(嵌套循环连接),但Nested-LoopJoin有三种变种:SimpleNested-LoopJoin,IndexNested-LoopJoin,BlockNested-LoopJoin(简单-索引-缓冲区)原理:1.SimpleNe
  • redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要redis持久化 redis持久化就是把数据保存在磁盘上,利用永久性存储介质将数据保存,在特定的时间将保存的数据进行恢复的工作机制redis提供两种持久化机制RDB:存储数据结果,关注点在数据AOF:存储操作
  • 通过SQL的执行过程来介绍MySQL的基础结构.     首先有一个user_info表,表里有一个id字段,执行下面这条查询语句:Select * form user_info where i
  • 索引(Index)是帮助MySQL高效获取数据的数据结构,索引的目的在于提高查询效率,就像字典和书籍的目录一样,有了目录,可以帮助你快速查找你需要的内容。可以理解为一个排好序的快速查找数据结构。也就是
  • 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别。今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的
  • 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句
学习大纲