返回顶部
首页 > 资讯 > 数据库 >【MySQL】MySQL gap lock产生时机
  • 1574
分享到

【MySQL】MySQL gap lock产生时机

2024-04-02 19:04:59 1574人浏览 薄情痞子
摘要

1)提出问题:我们通常说在Repeate read下面,会有next-key lock(LOCK_ORDINARY)对应值0,而READ COMMITTED隔离级别下只会有记录锁LOCK_REC_NOT_G

1)提出问题:我们通常说在Repeate read下面,会有next-key lock(LOCK_ORDINARY)对应值0,而READ COMMITTED隔离级别下只会有记录LOCK_REC_NOT_GAP(对应值1024),那么什么时候会有gap lock(LOCK_GAP)对应值512?


2)官方的一个死锁例子(之所以会选这个例子,是因为这个例子非常典型,为了更好的效果,我将隔离级别设置为READ COMMITTED):

    创建表并插入数据
    CREATE TABLE `locktest6` (   `id` int(11) NOT NULL,   `a` int(11) NOT NULL,   `b` varchar(30) NOT NULL DEFAULT 'xDDD',   PRIMARY KEY (`id`),   UNIQUE KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    INSERT INTO `locktest6` VALUES (3,2,'xddd'),(9,20,'ddd'),(12,13,'ddd'),(19,7,'cccc'),(20,5,'abcd'),(21,4,'fff');

    开启三个会话,会话的顺序是(1->2->3)
    session 1:
    【MySQL】MySQL gap lock产生时机



    session 2:
    【MySQL】MySQL gap lock产生时机

    session 3
    

    实验现象,这里session2、session3会阻塞(这里读者可以自己实验)

    现象分析:
    我们来看阻塞时的锁获取与等待情况
                            


这里唯一键a=17的二级索引加了LOCK_X|LOCK_REC_NOT_GAP|LOCK_REC锁,其次这条记录上面还有两把锁(LOCK_S|LOCK_ORDINARY|LOCK_WaiTTING)在等待,分别是session2与session3的

这里的原因是:
session 1的insert 本来不加锁(是隐式锁,隐式锁是一种延迟加锁的策略);

当session插入a=17的记录时,发现与session1重复,这时session2会给session1加锁,锁为LOCK_X|LOCK_REC_NOT_GAP|LOCK_REC,同时把自己置为等待状态LOCK_S|LOCK_ORDINARY|LOCK_WAITTING,注意,这里为什么自己(session2)等待的时候是LOCK_S而不是LOCK_X呢,其实是为了提高并发

session 3处于等待是因为session1 a=17的记录已经被session2加上了LOCK_X|LOCK_REC_NOT_GAP|LOCK_REC锁,而session3的a=17与session1的a=17重复,为了检测唯一性,也会将自己置为等待状态,锁为LOCK_S|LOCK_ORDINARY|LOCK_WAITTING


回滚session1,session3会成为死锁牺牲品,session2插入成功

session2
【MySQL】MySQL gap lock产生时机
session3

【MySQL】MySQL gap lock产生时机


这是的死锁情况以及加锁情况

这里我们发现了gap锁的踪迹,我们稍后分析
死锁牺牲session3之后,这时的session2的加锁情况
【MySQL】MySQL gap lock产生时机
这里锁信息连到了一起,哈哈,如何解释呢,我们稍后分晓


先分析上面的死锁:
session 1 rollback后,二级索引记录为(33,17)的记录的被删除,上面的session2,session3上的LOCK_S|LOCK_ORDINARY|LOCK_WAITTING将他的gap锁分别迁移到下一条记录,即二级索引(20,9)的记录上由两把锁,分别为session2与session占有,锁为LOCK_S|LOCK_GAP|LOCK_REC,即死锁图中的lock mode s lock gap before rec;与此同时,session 2与session3在插入的时候,还要检测下一条记录上(即(20,9)的记录上)的锁是否与LOCK_X|LOCK_GAP|LOCK_INTENSION冲突,这样就形成了session2的LOCK_X|LOCK_GAP|LOCK_INTENSION在等待session3 的LOCK_S|LOCK_GAP|LOCK_REC释放,而session3的LOCK_X|LOCK_GAP|LOCK_INTENSION则在等待session2的LOCK_S|LOCK_GAP|LOCK_REC释放,这样就形成了死锁,这里事务选择回滚了session3

再分析session2的加锁情况:
session3回滚后 ,session2获得了LOCK_X|LOCK_GAP|LOCK_INTENSION锁与LOCK_S|LOCK_GAP|LOCK_REC,这个锁加在记录(20,9)上;heap no 8的记录即session2插入的记录也获得了LOCK_S|LOCK_GAP|LOCK_REC锁,这是因为插入时,会进行锁分裂,将heap no 8下一条记录的(20,9)的锁LOCK_S|LOCK_GAP|LOCK_REC迁移到了heap no 8的记录上;为啥上面的锁信息会连在一起呢,即既有LOCK_S|LOCK_ORDINARY|LOCK_REC又有LOCK_S|LOCK_GAP|LOCK_REC呢,答案是:这里的LOCK_S|LOCK_ORDINARY|LOCK_REC只是表示下面行LOCK_S|LOCK_GAP|LOCK_REC有LOCK_S|LOCK_ORDINARY|LOCK_REC继承而来,并不表示记录上还加了LOCK_S|LOCK_ORDINARY|LOCK_REC锁


3)总结
    gap锁一般很少见到,当唯一索引检测重复的值的时候,往往会产生gap锁;另外当可重复读隔离级别下,做等值查询时,也会碰到gap锁(这个读者可以自己去实验),时间仓促,没有整理。


您可能感兴趣的文档:

--结束END--

本文标题: 【MySQL】MySQL gap lock产生时机

本文链接: https://lsjlt.com/news/49299.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【MySQL】MySQL gap lock产生时机
    1)提出问题:我们通常说在Repeate read下面,会有next-key lock(LOCK_ORDINARY)对应值0,而READ COMMITTED隔离级别下只会有记录锁LOCK_REC_NOT_G...
    99+
    2024-04-02
  • mysql 间隙锁 Gap Lock
      MySQL InnoDB支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面。 间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一...
    99+
    2024-04-02
  • mysql innodb lock机制原理
    一.lock 和 latch latch 一般称为闩锁,目的是用来保证并发线程操作临界资源的正确性,无死锁检测机制。分为:mutex(互斥量),rwlock(读写锁) lock 的对象是事务,用来锁定的数据...
    99+
    2024-04-02
  • mysql中怎么随机产生字符串
    mysql中实现随机产生字符串的方法生成指定长度的随机字符串CREATE DEFINER=`root`@`localhost` FUNCTION `RAND_STR`(n INT) RETU...
    99+
    2024-04-02
  • 生产环境MySQL索引时效的排查过程
     早上收到开发同学求助,有个SQL查询耗时特别长,看了执行计划发现没有走索引,但是不知道原因在哪里,我们一起来分析一下。 mysql>explain SELEC...
    99+
    2024-04-02
  • 如何理解mysql Meta Lock 机制
    如何理解mysql Meta Lock 机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  &nb...
    99+
    2024-04-02
  • MySQL生产库开发规范
    MySQL开发规范文件状态:[  ] 草稿[√] 正式发布[  ] 正在修改 文件标识:  当前版本: V1.0 作 &nbs...
    99+
    2024-04-02
  • mysql如何产生死锁的
    这篇文章将为大家详细讲解有关mysql如何产生死锁的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql中死锁<DeadLock>:是指两个或两个以上的进...
    99+
    2024-04-02
  • 重启Mysql时报错rm: cannot remove ‘/var/lock/subsys/mysql‘: Permission denied
    只有用mysql重启时报错,用root不报错 [mysql@t3-dtpoc-dtpoc-web04 bin]$ service mysql restart Shutting down MySQL.. SUCCESS!  rm: canno...
    99+
    2023-10-09
    mysql adb 数据库
  • 生产mysql在线配置主从
    一、将主库数据导出 mysqldump -uuser -ppassword  -S /tmp/mysql.sock --single-transaction --master-data=2 --...
    99+
    2024-04-02
  • mysql死锁是如何产生的
    这篇文章主要介绍mysql死锁是如何产生的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql是一种关系型数据库管理系统,使用的 SQL 语言是用于访问数据库的最常用标准化语言。...
    99+
    2024-04-02
  • mysql脏页是如何产生的
    mysql 中,脏页是指存储在缓冲池中但尚未写入磁盘的数据页。脏页产生于事务更新、写缓冲池以及事务隔离级别、缓冲池大小、写入负载等因素。mysql 通过检查点、后台刷新及脏页刷新优先级等...
    99+
    2024-06-15
    mysql
  • 使用Druid创建MySQL链接时在DruidAbstractDataSource.createPhysicalConnection产生SQLException异常
     一、使用Druid创建数据库链接时报错 2023-02-15 15:53:49.353 [planflight] [Druid-ConnectionPool-Create-1819862363] ERROR [DruidDataSourc...
    99+
    2023-09-11
    java 数据库 mysql
  • mysql怎么避免死锁的产生
    这篇文章主要讲解了“mysql怎么避免死锁的产生”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql怎么避免死锁的产生”吧!说明等待事务超时,主动回滚。进行死锁检查,主动回滚某一事务,让...
    99+
    2023-06-20
  • 生产环境MySQL索引时效的排查过程是什么
    今天小编给大家分享一下生产环境MySQL索引时效的排查过程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。问题:mysq...
    99+
    2023-06-29
  • Centos7.5 生产环境搭建MySQL 5.7主从
    环境:服务器两台:192.168.19.77 4核心,16G内存 内网隔离,不通外网192.168.19.78 4核心,16G内存 内网隔离,...
    99+
    2024-04-02
  • 【Mysql】两条insert 语句产生的死锁
    背景:查看status日志发现两条insert 出现了死锁 RECORD LOCKS space id 388 page no 27032 n bits 616 index `idx_sv...
    99+
    2024-04-02
  • mysql query error产生的原因是什么
    MySQL查询错误可能有多种原因,包括但不限于以下几种:1. 语法错误:查询语句的语法错误是最常见的错误之一。例如,缺少关键字、拼写...
    99+
    2023-08-31
    mysql
  • MySQL产生死锁原因分析讲解
    目录锁类型介绍死锁产生原因和示例1、产生原因2、产生示例案例一案例二案例三案例四案例五案例六锁类型介绍 MySQL 有三种锁的级别:页级、表级、行级 1 表级锁:开销小,加锁快;不...
    99+
    2022-12-16
    MySQL产生死锁原因 MySQL死锁 MySQL死锁处理
  • MySQL - 死锁的产生及解决方案
    MySQL - 死锁的产生及解决方案 1. 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件 2. 死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁 3. 死锁排查4. 实例分析...
    99+
    2023-08-17
    mysql 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作