MySQL间隙锁是什么

这篇具有很好参考价值的文章主要介绍了MySQL间隙锁是什么。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 写在前面的话

当下各行各业都卷到飞起,IT行业更是如此。对很多程序员来说,面试的难度、深度、广度,都让你承受着 "你这个年纪不该承受的一切"。以MySQL为例,我大学刚毕业那会,面试时也就问一下 "MySQL查询怎么去重?"、"MySQL组函数有哪些?";而现在刚毕业的学生去面试,上来就是 "聊聊MySQL的架构吧"、"你看过MySQL的源码没有?"。现在想想还真是庆幸自己毕业的早,以那时大学毕业的水平拿到现在找工作,估计得饿死。

存储(数据库存储或者内存存储)是所有系统中最最重要的一个部分,它们提供了任何系统运行所需要的所有数据,程序员几乎每日的工作都是直接或者间接地与各种存储打交道。正因如此,存储必然更是面试时的 "重灾区"。

二. MySQL间隙锁

我第一次听到MySQL的间隙锁,还是在2016年去一家公司面试的时候,整个过程还是非常愉快与顺利的。但面试那哥们儿突然问了一句, "你知道MySQL的间隙锁吗?",我脑子中迅速提取各种锁:"悲观锁"、"乐观锁"、"行锁"、"表锁"、"悲观锁"、"乐观锁"......阿xi吧,间隙锁是个什么鬼?!

然后我只能无奈地回答道:"这个我不是很清楚了",然后面试就结束了.......从那个公司出来后,我就坐的花坛边,用手机各种查,各种搜,才对间隙锁有了初步的了解,在未来几天里我就一直花时间来深入地理解间隙锁。

笔者认为,要想深入理解某个概念,必须得搞明白这个东西它出现的意义在哪里?它到底是为了解决什么问题而产生的?然后带着这些疑问去寻找答案,当谜底一层层的解开,你会觉得神清气爽,整个人都会觉得精神抖擞。

我在给大家在解答什么是间隙锁,及其能够解决什么问题之前,会先带各位捋清一些相关知识:事务的隔离级别以及快照读和当前读。

2.1 事务的隔离级别

事务的隔离级别有四种,以及每种隔离级别会产生的问题,都如下表所示:

MySQL间隙锁是什么,Java,mysql,数据库

有些人可能会问了,间隙锁与隔离级别有什么关系呢?其实间隙锁的出现,就是为了解决InnoDB存储引擎中,可重复读在当前读中产生的幻读问题!

2.2 快照读与当前读

2.2.1 快照读

在讲解快照读之前,我们先来看看笔者的一段SQL操作。

MySQL间隙锁是什么,Java,mysql,数据库

我们知道,MySQL的默认隔离级别是可重复读。按照红色标注的序号,并没有出现幻读问题,这是什么原因呢?这是因为MySQL通过快照读,解决了可重复读这种隔离级别情况下的幻读问题!那什么又是快照读呢?

快照读,简单点来说就是数据有很多个版本,事务在并发执行的时候,某个事务读取到的是其中一个快照。笔者再用一个可能不是很贴切但比较好理解的例子来给大家说明,就是事务或者查询开始的时候,针对要查询的数据生成一些副本,然后在后续的查询中获取的是该副本的数据。

2.2.2 当前读

当前读的意思是,查询到的永远是数据库中最新的数据,没有快照。适用如下这些语句:

  1. select ... from table_name in share mode;
  2. select ... from table_name for update;
  3. insert;
  4. update;
  5. delete

2.3 间隙锁

 2.1 事务的隔离级别 章节中我们提过,间隙锁是为了解决InnoDB存储引擎中可重复读导致的幻读问题,那么到底什么是间隙锁呢?我们先看如下的操作:

MySQL间隙锁是什么,Java,mysql,数据库

针对图中的第二条查询SQL语句:  

select * from foo where id < 10 and id > 5 for update;

笔者提出两个问题:

  1. 该SQL很明显是当前读,而当前读读取的是数据库中最新的数据。那么现在有个问题,此时如果另外有一个事务插入一条id为8的数据,再执行相同的SQL语句,是否就不会出现幻读了吗?
  2. 如果问题1的结果是没有出现幻读,肯定是通过锁机制,那么这又是如何上锁的?那么如果插入的id分别为8、12、17的数据,又会出现什么现象呢?id为12、17并不会让查询结果产生幻读吗?

针对问题一,如下图所示:

MySQL间隙锁是什么,Java,mysql,数据库

我们知道,当前读读取的是数据库中最新的数据。右侧的数据如果能提交的话,左侧的查询必然会产生幻读问题,所以会通过上锁的方式阻止事务的提交,而这个锁就是间隙锁。当你理解了问题二,我深信你一定会明白什么是间隙锁。

针对问题一,依次观察如下两张图:

MySQL间隙锁是什么,Java,mysql,数据库

出现上面两图结果的原因在于,因为 foo表中的数据id为1、4、7、9、15、18,当查询id在(5,10)之间的时候,锁的并不是整个数据库表,而是查找离下限(5)最大的id值和上限(10)最小的id值,分别为4和15;然后锁的区间范围为(4,15],也就是说处于这个区间的id是无法插入进去的,所以导致了上面两张图的结果。

现在你知道间隙锁是怎么回事了吗?如果还有不明白的,可以在评论区留言讨论哦。当然,你也可以加入到我们的学习交流群,和大家一起来互动学习哦。文章来源地址https://www.toymoban.com/news/detail-616274.html

到了这里,关于MySQL间隙锁是什么的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起来,每当应用程序需

    2024年02月07日
    浏览(54)
  • 用Java操作MySQL数据库

    在pom.xml的标签里加上下面的内容 如果是MySQL 5.8那么的版本号是5.x.x, 例如5.1.49 如果是MySQL 8.0那么的版本号是8.x.x, 例如 8.0.28 构建实体类, 类属性和表对应上, 方便来接收查询数据 对于一个学生信息表 新建学生类 省略了设置数据源参数和关闭数据源的操作 如果你想update, 那么

    2024年02月13日
    浏览(43)
  • 华为云数据库 RDS for MySQL 的读写分离,凭什么打破企业数据瓶颈?

    随着云2.0时代的到来,众多企业发现人工智能、大数据算法能为企业发展带来巨大的利润,人工智能、大数据算法等计算机算法被应用于企业的生产和发展,云+业务逐渐成为现代化企业发展的潮流,对传统数据库模式提出了挑战。 企业的业务从线下发展到线上,这就使得服

    2024年02月22日
    浏览(51)
  • Facebook 用户量十分庞大,为什么还使用 MySQL 数据库?

    当谈到社交媒体巨头Facebook时,我们立刻想到的是其庞大的用户基础和每日海量的数据流。然而,您可能会惊讶地发现,尽管面对如此巨大的规模,Facebook 仍然选择使用 MySQL 数据库作为其核心的数据存储和管理系统。 为什么Facebook没有选择其他更强大或更高级的数据库系统?

    2024年02月04日
    浏览(49)
  • Flink读取mysql数据库(java)

    代码如下: 运行结果如下:

    2024年02月12日
    浏览(41)
  • 【JDBC】Java连接MySQL数据库

    数据库编程指的是通过编程语言与数据库进行交互和操作的过程,包括使用编程语言创建、连接、查询、更新和删除数据库中的数据,以及管理数据库结构和其他相关工作等。 另外,不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包

    2024年02月15日
    浏览(128)
  • 【java】Java连接mysql数据库及mysql驱动jar包下载和使用

    基本概念:java 数据库连接,简称:( java DataBase Connectivity ),java语言操作数据库。 其实是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码时驱

    2024年02月02日
    浏览(45)
  • idea实现Java连接MySQL数据库

    首先如果没有mysql的需要先下载MySQL,可以看这个教程: Mysql超详细安装配置教程(保姆级)_mysql安装及配置超详细教程-CSDN博客 官网:MySQL :: Download Connector/J 解压并将驱动jar包导入idea , 在Java项目中创建一个bin文件夹,然后把jar包Ctrl+C,V到bin文件夹   然后lib右键,点击Add as L

    2024年02月03日
    浏览(51)
  • 【JAVA】MySQL数据库信息管理系统

    目录 前言 一、环境搭建 二、功能实现 1.商品信息类的创建 2.商品信息的查询 3.商品信息的添加 4.商品信息的修改 5.商品信息的删除 三、主类的调用 1.加载配置文件并获取数据库连接 2.界面的搭建 3.功能的选择 总结 JAVA实现的MySQL数据库信息管理系统 包含数据库的增删改查功

    2024年02月09日
    浏览(74)
  • Java基础 - JDBC操作数据库(MySql)

    JDBC是Java语言操作数据库的一套接口,也就是规范,具体的实现需要各个数据库厂商去实现。比如我们在使用JDBC去连接mySql数据库的时候,我们必须要依赖一个叫做mysql-connector-java的jar包,这里面封装的就是mySql对于JDBC的实现。 Java中使用JDBC 首先引入mysql-connector-java依赖,比如

    2024年01月25日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包