20.3.5 间隙锁(Next-Key锁)

《深入浅出MySQL——数据库开发、优化与管理维护》从数据库的基础、开发、优化、管理4方面对MySQL进行了详细的介绍,其中每一部分都独立成篇,每一篇又包括多个章节。本书面向实用,内容覆盖广泛,讲解由浅入深,适合于各个层次的读者。本文介绍了InnoDB锁。

20.3.5 间隙锁(Next-Key锁)

当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。

举例来说,假如emp表中只有101条记录,其empid的值分别是 1,2,...,100,101,下面的SQL:

Select * from  emp where empid > 100 for update;

是一个范围条件的检索,InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的“间隙”加锁。

InnoDB使用间隙锁的目的,一方面是为了防止幻读,以满足相关隔离级别的要求,对于上面的例子,要是不使用间隙锁,如果其他事务插入了empid大于100的任何记录,那么本事务如果再次执行上述语句,就会发生幻读;另外一方面,是为了满足其恢复和复制的需要。有关其恢复和复制对锁机制的影响,以及不同隔离级别下InnoDB使用间隙锁的情况,在后续的章节中会做进一步介绍。

很显然,在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待。因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。

还要特别说明的是,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁!

在如表20-13所示的例子中,假如emp表中只有101条记录,其empid的值分别是1,2,......,100,101。

表20-13    InnoDB存储引擎的间隙锁阻塞例子

session_1

session_2

mysql> select @@tx_isolation;

+-----------------+

| @@tx_isolation  |

+-----------------+

| REPEATABLE-READ |

+-----------------+

1 row in set (0.00 sec)

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

mysql> select @@tx_isolation;

+-----------------+

| @@tx_isolation  |

+-----------------+

| REPEATABLE-READ |

+-----------------+

1 row in set (0.00 sec)

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

当前session对不存在的记录加for update的锁:

mysql> select * from emp where empid = 102 for update;

Empty set (0.00 sec)

这时,如果其他session插入empid为201的记录(注意:这条记录并不存在),也会出现锁等待:

mysql>insert into emp(empid,...) values(201,...);

阻塞等待

Session_1 执行rollback:

mysql> rollback;

Query OK, 0 rows affected (13.04 sec)

由于其他session_1回退后释放了Next-Key锁,当前session可以获得锁并成功插入记录:

mysql>insert into emp(empid,...) values(201,...);

Query OK, 1 row affected (13.35 sec)

间隙锁(Next-Key锁)相关推荐

  1. 八、Mysql 间隙锁(gap 锁)与慢查询

    Mysql 间隙锁(gap 锁)与慢查询 gap锁与慢查询 gap锁 事务语法 开启事务 事务回滚 事务提交 还原点(演示) 业务设计 逻辑设计 范式设计 查询测试 反范式设计 总结 范式化设计优缺点 ...

  2. mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

    详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC  ...

  3. 数据库锁与加锁情况介绍(记录锁、间隙锁、next-key锁)

    数据库的锁 关于mysql有哪些锁?锁的分类有哪些?可查看另外一篇博客:mysql 的锁 下面主要是记录在实际情景中的加锁情况进行分析 测试环境介绍 innodb 引擎下,隔离级别在 REPEATAB ...

  4. MySQL的锁机制 - 记录锁、间隙锁、临键锁

    记录锁(Record Locks) 记录锁是 封锁记录,记录锁也叫行锁,例如: SELECT * FROM `test` WHERE `id`=1 FOR UPDATE; 它会在 id=1 的记录上加 ...

  5. Mysql中的读写锁,表锁和行锁,间隙锁

    Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的 ...

  6. mysql的锁机制(读锁,写锁,表锁,行锁,悲观锁,乐观锁,间隙锁)

    读锁和写锁 介绍 MyISAM表锁中的读锁和写锁 读锁(共享锁S): 对同一个数据,多个读操作可以同时进行,互不干扰.加锁的会话只能对此表进行读操作,其他会话也只能进行读操作.MyISAM的读默认是加 ...

  7. [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)

    不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...

  8. 谈谈InnoDB下的记录锁,间隙锁,next-key锁

    innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁.行锁,即记录锁,其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁.就不多做介绍,主要介绍间隙锁,next-key锁. ...

  9. MySQL高级 - 锁 - InnoDB行锁 - 间隙锁危害

    隙锁危害 当我们用范围条件,而不是使用相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据进行加锁: 对于键值在条件范围内但并不存在的记录,叫做 "间隙(GAP)&qu ...

  10. mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

    你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...

最新文章

  1. JavaScript 页面间传值
  2. delphi中的函数传参如何传枚举参数_shell脚本的函数介绍使用和工作常用案例。建议收藏...
  3. UVA 12063 Zeros and Ones
  4. python判断括号有效,在Python中检查括号是否平衡
  5. 我的第一个用Hibernate框架写的小例子
  6. java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
  7. Winform中实现连接Mysql8使用mysqldump实现备份表的数据
  8. Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet
  9. sgd 参数 详解_代码笔记--PC-DARTS代码详解
  10. kafka消息队列学习笔记
  11. 论文笔记:TABERT: Pretraining for Joint Understanding of Textual and Tabular Data
  12. 4K TEST SEQUENCES 测试视频片段下载
  13. 通信原理学习笔记5-1:数字调制——脉冲成形滤波器选择(码间串扰、Nyquist准则、升余弦滚降滤波器、眼图)
  14. nginx 连接php
  15. 最深入的python教程_天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
  16. Daytime服务器
  17. 通俗易懂的epoll
  18. 跌倒综述 Deep Learning Based Systems Developed for Fall Detection A Review
  19. 微信小程序商城高并发解决方案
  20. UE4/5Control Rig绑定(向前解析)

热门文章

  1. 毛哥的快乐生活(19) 那就搞一个servlet
  2. java中ioc作用_java中的ioc是什么
  3. 工程化编程实战--代码中的软件工程
  4. Large Movie Review Dataset v1.0
  5. java怎么用switch求闰年_2. 用switch结构实现输入某年某月某日,判断这一天是这一年的第几天。(考虑闰年) 源程序命名为: 完整学号姓名2.c 。_电子商务物流答案_学小易找答案...
  6. cobalt strike木马免杀
  7. C#中使用python(基于Ironpython)
  8. 梦幻模拟战pc版更新服务器正在维护,原创:WIN7完美运行《梦幻模拟战3》PC版本解决方案。...
  9. 15年美亚杯电子取证
  10. MySQL 中的 UNION 语句