MySQL-InnoDB-MVCC多版本并发控制 剖析

MySQL-InnoDB-MVCC多版本并发控制 剖析

什么是MVCC?

MVCC的实现是通过保存数据在某个时间点的快照来实现的、也就是说,不管需要执行多长时间、每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

划重点

MVCC(Multiversion concurrency control) 多版本控制、提供并发访问数据库时、对事务内读取的到内存做处理,用来避免写操作堵塞读操作的并发问题

MVCC的背后逻辑是什么 ?

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

在RR(READ REPEATABLE)隔离级别下,MVCC的操作过程如下:

select操作

  1. InnoDb只查找版本早于(包含等于)当前事务版本的数据行。可以保证事务读取的行,要么在事务开始前已经存在的,要么事务操作(插入或者修改)
  2. 行的删除版本要么未定义,要么大于当前事务版本号。可以保证事务读取到的行,在事务开始之前未被删除

insert操作

  1. innodb为新插入的每行保存当前的版本号作为行插入标识

delete操作

  1. innodb为删除的行保存当前系统的版本号作为行删除标识

update操作

  1. innodb 为插入行记录、保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识

好处

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

不足之处

每行记录都需要增加额外的存储空间、需要更多的行检查工作,以及一些额外的维护工作。

业余扩展

  1. mysql默认的隔离级别是什么呢?mysql默认采用RR隔离级别
  2. MVCC使用有哪些限制呢、MVCC可以在所有的隔离级别下工作吗? NO,MVCC只在RR(repeatable read)和RC(read committed)这个两个级别下工作。因为RU(read uncommitted)总是读取最新的数据行,而不是符合当前事务版本的数据行,而Serializable则会对所有读取的行都锁
  3. 那么每次操作都会有快照的操作,什么情况下会删除呢?由于旧数据并不是真正的删除,需要对这写数据进行清理,Innodb会开启一个后台线程执行清理工作,清理的规则是:讲删除版本号小于当前系统版本的行删除,这个操作叫做purge
    4.RC和RR在锁方面有什么不同?
    • RR支持间隙锁(gap lock)Next-Key Lock 而 RC不支持间隙锁 (gap lock ) mysql的RR级别需要通过gap lock来解决幻读的问题,在RC隔离级别则允许存在不可重复读和幻读的,因此RC的并发一般要好于RR
    • RC 是通过where条件过滤之后,不符合条件的记录上的行锁,会释放掉(显然破坏了两阶段加锁的原则)但是RR隔离级别,即使不符合where条件的积累也不会释放行锁和gap lock 所以从锁的方面来看,RC的并发应该要好于RR

你可能感兴趣的:(mysql,数据库优化,技术)