首页 > 其他分享 >行锁、间隙锁和临建锁有什么区别

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

时间:2023-06-17 22:34:29浏览次数:56  
标签:事务 临建 间隙 幻读 行锁 MVCC 数据

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

面试突击: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 中的锁类型又有很多种,如行锁、间隙锁、临建锁等。

标签:事务,临建,间隙,幻读,行锁,MVCC,数据
From: https://www.cnblogs.com/Leo_wl/p/17488381.html

相关文章

  • 调整直线导轨间隙有什么方法?
    直线导轨作为机械行业中非常重要的传动部件,应用范围当然相当广泛,尤其是自动化设备,基本上我们都能看到它的作用。在机械行业待得久的人都知道,直线导轨在使用的过程中,为了保证直线导轨的正常工作,直线导轨的滑动面之间应保持适当的间隙。间隙过小会增加摩擦,间隙过大会降低导向精度。正......
  • MySQL的间隙锁
    什么是间隙锁?间隙锁就是在MySQL的一个范围锁,对某个不存在数据的范围进行加锁,加锁后,不能在这个范围内插入数据;在可重复读事务隔离级别下,默认使用的是next-keyLock(行锁+间隙锁);间隙锁是为了解决什么问题?间隙锁就是MySQL在Innodb存储引擎在可重复读的事务隔离级别下为了解决当前读......
  • MVCC、间隙锁、表级锁、行级锁、页级锁、共享锁等等
    转载于:https://mp.weixin.qq.com/s/weX-RO8DryHQpX8X0TXp3Q前言:在尼恩的读者社区(50+个)中,经常遇到:MVCC、间隙锁、UndoLog链、表级锁、行级锁、页级锁、共享锁、排它锁、记录锁等等相关的面试题。这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的......
  • MySQL(二十)锁(二)表锁、行锁与页级锁
    目录MySQL(二十)锁(二)表锁、行锁与页级锁从操作粒度的锁类型划分:表级锁、行级锁和页锁1表级锁(TableLock)1.1表级别的S和X锁1.2意向锁......
  • MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
    锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具。在计算机中,是协调多个进程或县城并发访问某一资源的一种机制。在数据库当中,除了传统的计算资源(CPU、RAM、I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源。如何保证数据并发访问的一致性、有效性,是所有数据库必须......
  • MySQL锁机制详解-表锁与行锁
    转、MySQL锁机制详解-表锁与行锁https://blog.csdn.net/huangjhai/article/details/119011417  转:什么是线程死锁?如何避免死锁? 相互强占彼此资源,导致彼此等待。线程挂起 阻塞......
  • 解决img标签之间的间隙
    1)img{display:block};将其改变为block元素,但是该方法太过粗暴,相当于从根本上改变了img2)img{vertical-align:top;}改变其垂直对齐方式3)div{font-size:0};把父元素的文字大小设置为04)div{line-height:0};把父元素的行高设置为05)img{float:left};使用float进行浮动6)div......
  • 最大间隙
    最大间隙题目描述给定一个序列a_1,a_2,...,a_n。其中a_1≤a_2≤...≤a_n。相邻两个数之间的差(后一个数减前一个数)称为它们的间隙。请问序列中最大的间隙值是多少?输入描述输入的第一行包含一个整数n,表示序列的长度。第二行包含n个正整数,为给定的序列。其中,1......
  • 面试突击:MVCC 和间隙锁有什么区别?
    MVCC和间隙锁是两种完全不同的机制,但它们的目的都是相同的,都是用来保证数据库并发访问的,我们先来看二者的定义。MVCC定义MVCC是多版本并发控制(Multi-VersionConcurrencyControl)的缩写,是一种并发控制的方法。在MVCC中,每个读操作会看到一个固定版本的数据库记录,即使在并发环境......
  • 共享锁、排他锁、互斥锁、悲观锁、乐观锁、行锁、表锁、页面锁、不可重复读、丢失修改
    共享锁(S锁)又称为读锁,可以查看但无法修改和删除的一种数据锁。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁。获准共享锁的事务只能读数据,不能修......