乐趣区

关于java:面试突击MVCC-和间隙锁有什么区别

MVCC 和间隙锁是两种齐全不同的机制,但它们的目标都是雷同的,都是用来保障数据库并发拜访的,咱们先来看二者的定义。

MVCC 定义

MVCC 是多版本并发管制(Multi-Version Concurrency Control)的缩写,是一种并发管制的办法。

在 MVCC 中,每个读操作会看到一个固定版本的数据库记录,即便在并发环境中,也不会呈现读取到了其余事务还未提交的数据的状况。

MVCC 通过保留数据在某个工夫点的快照来实现这一点。在读取数据时,只会读取在该工夫点之前提交的数据。在写入数据时,会为每个写入操作创立一个新版本的数据,而不是间接笼罩原有的数据。这样,读操作就能够读取旧版本的数据,而写操作则能够写入新版本的数据,从而实现了并发管制。

在 MySQL 中,InnoDB 存储引擎就是应用 MVCC 来实现并发管制的。

间隙锁定义

间隙锁是一种锁定索引范畴而非理论数据的锁,它能够锁定一个范畴,避免其余事务在这个范畴内插入数据,从而保障了范畴内的数据的唯一性。在 MySQL 中,InnoDB 存储引擎反对间隙锁。当应用 SELECT … FOR UPDATE 或 SELECT … LOCK IN SHARE MODE 语句时,InnoDB 存储引擎会主动应用间隙锁来锁定索引范畴。

如果一个事务在一个间隙上持有了锁,那么其余事务就不能在这个间隙上插入数据,然而能够在这个间隙之前或之后的地位插入数据。

为什么要有 MVCC?

既然曾经有锁能够避免并发拜访了,那为什么还须要 MVCC 呢?

MVCC 的诞生次要是出于性能的思考,因为 MVCC 中没有用到锁,它是通过多版本并发管制的伎俩来实现数据库并发拜访的,这样相比于加锁性能就会好很多。

MVCC 实现原理

MVCC 居然这么强,那它是怎么实现的呢?
简略来说 MVCC 是通过以下 3 大组件实现的:

  1. 暗藏字段:每个执行的 SQL 命令都有几个暗藏的字段,其中有一个事务 ID 字段,很重要。
  2. undo log(回滚日志):外面记录了 SQL 命令执行的历史数据。
  3. Read View(读视图):蕴含快照读(一个快照,保留了数据库某个时刻的数据)和一些重要的属性。

它的实现原理简略来说,是通过 SQL 中暗藏的字段事务 ID(本人的版本号)和 Read View 中的属性版本号进行比照,比照之后决定应用 Read View 中的快照或 undo log 中的历史数据(比照的规定是 MVCC 机制的规定,本文不展开讨论),最初再将合乎的数据返回。

MVCC 能够解决幻读吗?

幻读是指在一个事务中,第一次查问某个范畴的数据时,发现有一些数据符合条件,然而当再次查问同样的范畴时,却发现多了一些或者少了一些数据。这种状况就被称为幻读。幻读是因为并发事务中的数据批改操作导致的,比方在一个事务中,另一个事务插入了一条符合条件的数据,导致第二次查问时多了一条数据。

MVCC 机制能够解决局部幻读问题 ,MVCC 是通过保留数据在某个工夫点的快照来实现来解决(局部)幻读问题的,在读取数据时,MVCC 会依据快照来确定可见的数据版本。这样,即便其余事务在读取数据时进行了批改,也不会影响以后事务的读取后果。

因而,MVCC 能够无效地解决这部分幻读问题。但须要留神的是,MVCC 只能解决读取数据时的幻读问题,对于写入数据时的幻读问题,还须要配合锁机制或应用更高的事务隔离级别(串行化)来解决。

也就是说,想要彻底解决 MySQL InnoDB 中 RR(REPEATABLE READ,可反复读)事务隔离级别的幻读问题,须要应用 MVCC + 锁机制独特来实现。

锁分类

在 MySQL InnoDB 中的锁机制不止有间隙锁,还有行锁和临建锁等。

行锁、间隙锁和临建锁有什么区别?

行锁、间隙锁和临建锁都是 MySQL 中的锁机制,它们的区别如下:

  • 行锁是针对某一行数据进行的锁定,能够避免其余事务批改该行数据。
  • 间隙锁是针对某一范畴的数据进行的锁定,能够避免其余事务在该范畴内插入数据。
  • 临建锁是行锁和间隙锁的组合,能够了解为一种非凡的间隙锁,它等于行锁 + 间隙锁,除了锁住记录自身,还会锁住索引之间的间隙,即锁定一段左开右闭的索引区间。

小结

MVCC 和锁机制解决了 MySQL InnoDB 中 RR 事务隔离级别的幻读问题,而 MySQL 中的锁类型又有很多种,如行锁、间隙锁、临建锁等。

本文已收录到 Gitee 开源仓库《Java 面试突击》,其中蕴含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、音讯队列等模块。Java 面试有它就够了:最全 Java 面试题库 (2023 版),继续更新 …

退出移动版