间隙锁(Next-Key锁)
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锁)相关推荐
- 八、Mysql 间隙锁(gap 锁)与慢查询
Mysql 间隙锁(gap 锁)与慢查询 gap锁与慢查询 gap锁 事务语法 开启事务 事务回滚 事务提交 还原点(演示) 业务设计 逻辑设计 范式设计 查询测试 反范式设计 总结 范式化设计优缺点 ...
- mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC ...
- 数据库锁与加锁情况介绍(记录锁、间隙锁、next-key锁)
数据库的锁 关于mysql有哪些锁?锁的分类有哪些?可查看另外一篇博客:mysql 的锁 下面主要是记录在实际情景中的加锁情况进行分析 测试环境介绍 innodb 引擎下,隔离级别在 REPEATAB ...
- MySQL的锁机制 - 记录锁、间隙锁、临键锁
记录锁(Record Locks) 记录锁是 封锁记录,记录锁也叫行锁,例如: SELECT * FROM `test` WHERE `id`=1 FOR UPDATE; 它会在 id=1 的记录上加 ...
- Mysql中的读写锁,表锁和行锁,间隙锁
Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的 ...
- mysql的锁机制(读锁,写锁,表锁,行锁,悲观锁,乐观锁,间隙锁)
读锁和写锁 介绍 MyISAM表锁中的读锁和写锁 读锁(共享锁S): 对同一个数据,多个读操作可以同时进行,互不干扰.加锁的会话只能对此表进行读操作,其他会话也只能进行读操作.MyISAM的读默认是加 ...
- [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)
不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...
- 谈谈InnoDB下的记录锁,间隙锁,next-key锁
innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁.行锁,即记录锁,其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁.就不多做介绍,主要介绍间隙锁,next-key锁. ...
- MySQL高级 - 锁 - InnoDB行锁 - 间隙锁危害
隙锁危害 当我们用范围条件,而不是使用相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据进行加锁: 对于键值在条件范围内但并不存在的记录,叫做 "间隙(GAP)&qu ...
- mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...
最新文章
- JavaScript 页面间传值
- delphi中的函数传参如何传枚举参数_shell脚本的函数介绍使用和工作常用案例。建议收藏...
- UVA 12063 Zeros and Ones
- python判断括号有效,在Python中检查括号是否平衡
- 我的第一个用Hibernate框架写的小例子
- java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
- Winform中实现连接Mysql8使用mysqldump实现备份表的数据
- Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet
- sgd 参数 详解_代码笔记--PC-DARTS代码详解
- kafka消息队列学习笔记
- 论文笔记:TABERT: Pretraining for Joint Understanding of Textual and Tabular Data
- 4K TEST SEQUENCES 测试视频片段下载
- 通信原理学习笔记5-1:数字调制——脉冲成形滤波器选择(码间串扰、Nyquist准则、升余弦滚降滤波器、眼图)
- nginx 连接php
- 最深入的python教程_天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
- Daytime服务器
- 通俗易懂的epoll
- 跌倒综述 Deep Learning Based Systems Developed for Fall Detection A Review
- 微信小程序商城高并发解决方案
- UE4/5Control Rig绑定(向前解析)
热门文章
- 毛哥的快乐生活(19) 那就搞一个servlet
- java中ioc作用_java中的ioc是什么
- 工程化编程实战--代码中的软件工程
- Large Movie Review Dataset v1.0
- java怎么用switch求闰年_2. 用switch结构实现输入某年某月某日,判断这一天是这一年的第几天。(考虑闰年) 源程序命名为: 完整学号姓名2.c 。_电子商务物流答案_学小易找答案...
- cobalt strike木马免杀
- C#中使用python(基于Ironpython)
- 梦幻模拟战pc版更新服务器正在维护,原创:WIN7完美运行《梦幻模拟战3》PC版本解决方案。...
- 15年美亚杯电子取证
- MySQL 中的 UNION 语句