返回顶部
首页 > 资讯 > 数据库 >MySQL中怎么重复读间隙锁
  • 684
分享到

MySQL中怎么重复读间隙锁

2024-04-02 19:04:59 684人浏览 泡泡鱼
摘要

Mysql中怎么重复读间隙锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。间隙锁(Gap  Lock)是Innodb

Mysql中怎么重复读间隙,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

间隙锁(Gap  Lock)是Innodb在可重复读提交下为了解决幻读问题时引入的锁机制,(下面的所有案例没有特意强调都使用可重复读隔离级别)幻读的问题存在是因为新增或者更新操作,这时如果进行范围查询的时候(加锁查询),会出现不一致的问题,这时使用不同的行锁已经没有办法满足要求,需要对一定范围内的数据进行加锁,间隙锁就是解决这类问题的。在可重复读隔离级别下,数据库是通过行锁和间隙锁共同组成的(next-key  lock),来实现的。

加锁规则有以下特性,我们会在后面的案例中逐一解释:

  • 1.加锁的基本单位是(next-key lock),他是前开后闭原则

  • 2.插叙过程中访问的对象会增加锁

  • 3.索引上的等值查询--给唯一索引加锁的时候,next-key lock升级为行锁

  • 4.索引上的等值查询--向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁

  • 5.唯一索引上的范围查询会访问到不满足条件的第一个值为止

案例数据

MySQL中怎么重复读间隙锁

以上数据为了解决幻读问题,更新的时候不只是对上述的五条数据增加行锁,还对于中间的取值范围增加了6间隙锁,(-∞,5](5,10](10,15](15,20](20,25](25,+supernum]  (其中supernum是数据库维护的最大的值。为了保证间隙锁都是左开右闭原则。)

案例一:间隙锁简单案例

MySQL中怎么重复读间隙锁

当有如下事务A和事务B时,事务A会对数据库表增加(10,15]这个区间锁,这时insert id = 12  的数据的时候就会因为区间锁(10,15]而被锁住无法执行。

案例二: 间隙锁死锁问题

MySQL中怎么重复读间隙锁

不同于写锁相互之间是互斥的原则,间隙锁之间不是互斥的,如果一个事务A获取到了(5,10]之间的间隙锁,另一个事务B也可以获取到(5,10]之间的间隙锁。这时就可能会发生死锁问题,如下案例。

事务A获取到(5,10]之间的间隙锁不允许其他的DDL操作,在事务提交,间隙锁释放之前,事务B也获取到了间隙锁(5,10],这时两个事务就处于死锁状态

案例三: 等值查询—唯一索引

MySQL中怎么重复读间隙锁

1.加锁的范围是(5,10]的范围锁

2.由于数据是等值查询,并且表中最后数据id = 10 不满足id= 7的查询要求,故id=10 的行级锁退化为间隙锁,(5,10)

3.所以事务B中id=8会被锁住,而id=10的时候不会被锁住

案例四: 等值查询—普通索引

MySQL中怎么重复读间隙锁

1.加锁的范围是(0,5],(5,10]的范围锁

2.由于c是普通索引,根据原则4,搜索到5后继续向后遍历直到搜索到10才放弃,故加锁范围为(5,10]

3.由于查询是等值查询,并且最后一个值不满足查询要求,故间隙锁退化为(5,10)

4.因为加锁是对普通索引c加锁,而且因为索引覆盖,没有对主键进行加锁,所以事务B执行正常

5.因为加锁范围(5,10)故事务C执行阻塞

6.需要注意的是,lock in share mode 因为覆盖索引故没有锁主键索引,如果使用for update  程序会觉得之后会执行更新操作故会将主键索引一同锁住

案例五: 范围查询—唯一索引

MySQL中怎么重复读间隙锁

next-key lock 增加范围锁(5,10]

根据原则5,唯一索引的范围查询会到第一个不符合的值位置,故增加(10,15]

因为等值查询有id =10 根据原则3间隙锁升级为行锁,故剩余锁[10,15]

因为查询并不是等值查询,故[10,15]不会退化成[10,15)

故事务B(13,13,13)阻塞,事务C阻塞

案例六: 范围查询—普通索引

MySQL中怎么重复读间隙锁

next-key lock 增加范围锁(5,10],(10,15]

因为c是非唯一索引,故(5,10]不会退化为10

因为查询并不是等值查询,故[10,15]不会退化成[10,15)

所以事务B和事务C全部堵塞

案例七: 普通索引-等值问题

上面的数据增加一行(30,10,30),这样在数据库中存在的c=10的就有两条记录

MySQL中怎么重复读间隙锁
MySQL中怎么重复读间隙锁

next-key lock 增加范围锁(5,10],(10,15]

因为是等值查询故退化为(5,10],(10,15),故事务B阻塞,事务C执行成功

加锁的范围如下图

案例八: 普通索引-等值Limit问题

MySQL中怎么重复读间隙锁

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中怎么重复读间隙锁

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

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

猜你喜欢
  • MySQL中怎么重复读间隙锁
    MySQL中怎么重复读间隙锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。间隙锁(Gap  Lock)是Innodb...
    99+
    2024-04-02
  • MySQL 中怎么开启和关闭间隙锁
    这篇文章给大家介绍MySQL 中怎么开启和关闭间隙锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 MySQL InnoDB支持三种行锁定方式:行锁(Re...
    99+
    2024-04-02
  • mysql间隙锁指的是什么
    这篇文章将为大家详细讲解有关mysql间隙锁指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、说明当我们用范围条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加...
    99+
    2023-06-15
  • mysql间隙锁触发条件是什么
    MySQL的间隙锁(Gap Lock)是用于防止并发事务插入相同的间隙数据,从而保证数据的一致性。间隙锁的触发条件有以下几种情况: ...
    99+
    2023-10-21
    mysql
  • 【Gap锁】Mysql的Gap锁在中文列下间隙怎样确定?
    通过本文记录一次Gaplock的验证,网上大多gaplock是基于明确是数字型列来测试gaplock的,这里不再重复,随便贴个相关地址:https://www.cnblogs.com/crazylqy/p/7821481.html  我的疑...
    99+
    2020-04-01
    【Gap锁】Mysql的Gap锁在中文列下间隙怎样确定?
  • MySQL中表锁,行锁,共享锁,排它锁,间隙锁的示例分析
    小编给大家分享一下MySQL中表锁,行锁,共享锁,排它锁,间隙锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!锁,在现...
    99+
    2024-04-02
  • mysql怎么实现可重复读
    要实现可重复读,可以通过以下两种方式:1. 使用事务隔离级别为"可重复读":在MySQL中,可通过设置事务隔离级别来实现不同的并发控...
    99+
    2023-09-15
    mysql
  • MySQL 中怎么实现可重复读操作
    这篇文章将为大家详细讲解有关MySQL 中怎么实现可重复读操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。账户表(省去其他字段)结构如下:CREATE&n...
    99+
    2024-04-02
  • MySQL中怎么处理读写锁
    这期内容当中小编将会给大家带来有关MySQL中怎么处理读写锁,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 1.创建锁锁的创建实际上就是初始化一个RW结构体(r...
    99+
    2024-04-02
  • Java 重入锁和读写锁怎么使用
    这篇文章主要介绍“Java 重入锁和读写锁怎么使用”,在日常操作中,相信很多人在Java 重入锁和读写锁怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java 重入锁和读写锁怎么使用”的疑惑有所帮助!...
    99+
    2023-06-08
  • MySQL中怎么阅读死锁日志
    MySQL中怎么阅读死锁日志,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。MySQL 5.6 事务隔离级别为RRCREATE TABLE `t...
    99+
    2024-04-02
  • Mysql中的幻读和不可重复读的区别
    Mysql中的幻读和不可重复读的区别是什么?这个问题可能是我们日常学习或工作经常见到的。通过这个问题,希望你能了解幻读和不可重复读的区别。不可重复读:同样的条件下,读取过的数据,当我们再次读取时值发生了变化...
    99+
    2024-04-02
  • MySQL事务隔离级别中可重复读与幻读
      每次谈到数据库的事务隔离级别,大家一定会看到这张表. 其中,可重复读这个隔离级别,有效地防止了脏读和不可重复读,但仍然可能发生幻读,可能发生幻读就表示可重复读这个隔离级别防不住幻读吗 我不管从数据库方面的教科书还是一些网络...
    99+
    2019-11-23
    MySQL事务隔离级别中可重复读与幻读
  • mysql死锁怎么复现
    死锁是指多个进程互相等待而无法执行的情况。在 mysql 中,死锁通常发生在更新同一行或多行数据时。复现死锁的步骤:创建数据表并插入数据。开启两个事务并设置锁。尝试更新同一行。提交事务。...
    99+
    2024-05-30
    mysql
  • 怎么去除CSS中inline-block换行引起的间隙
    这篇文章主要介绍“怎么去除CSS中inline-block换行引起的间隙”,在日常操作中,相信很多人在怎么去除CSS中inline-block换行引起的间隙问题上存在疑惑,小编查阅了各式资料,整理出简单好用...
    99+
    2024-04-02
  • MySQL的不可重复读和幻读是什么意思
    这篇文章主要介绍“MySQL的不可重复读和幻读是什么意思”,在日常操作中,相信很多人在MySQL的不可重复读和幻读是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”My...
    99+
    2024-04-02
  • mysql 中怎么设置事务锁超时时间
    mysql 中怎么设置事务锁超时时间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Mysql数据库采用InnoDB模式,默认参数:innodb...
    99+
    2024-04-02
  • jmeter怎么读取json重复数据
    要在JMeter中读取重复的JSON数据,可以使用以下步骤:1. 添加一个HTTP请求,用于发送请求和接收JSON响应。2. 在HT...
    99+
    2023-08-15
    jmeter json
  • 怎么在mysql中删除重复行
    今天就跟大家聊聊有关怎么在mysql中删除重复行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。表relation create ...
    99+
    2024-04-02
  • MySQL中怎么处理重复数据
    MySQL中怎么处理重复数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。防止表中出现重复数据你可以在MySQL数据表中设置指定的字段为 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作