MySQL中的next-key lock
MySQL中的next-key lock
- next-key lock是啥
- 有啥用
- 幻读如何产生
再次推荐一下丁奇的《MySQL实战45讲》,不同阶段阅读该专栏,总能收获不同的感悟。阅读本文,即默认已经知道“当前读”和“快照读”的含义了。
next-key lock是啥
间隙锁(Gap锁)和行锁合称 next-key lock。以该表t为例子:
在MySQL采用innodb,可重复读模式的情况下,执行如下语句:
select * from t for update
此时,for update情况下,select是基于当前读。那么会给该表加上间隙锁,锁住区间:(-⚮,0) (0,5) (5,10) (10,+supremum)
。
InnoDB 给每个索引加了一个不存在的最大值 supremum
除此之外,还会给该表加上一个行锁,锁住对应的行,综合间隙锁来看,我们可以采用一个左开右闭的区间表示。
(-⚮,0] (0,5] (5,10] (10,+supremum]
而行锁 +间隙锁 组成了我们的 next-key lock。
有啥用
有人说innodb,可重复读的情况下,还会出现幻读的现象。其实这里涉及到对幻读的一个理解。
- 可重复读隔离级别下,普通的查询属于快照读,是不会看到别的事务插入的数据的。因此,幻读只有可能在“当前读”下才会出现。
- 但此种情况亦不能称为幻读。
- 幻读仅专指“新插入的行”。
也就是说,通过next-key lock, 在innodb,可重复读的情况下,幻读的现象是已经解决的。(感谢间隙锁~)
幻读如何产生
只考虑行锁,不考虑间隙锁,以上图作为待查寻的表,查询结果如图:
- sessionA开启一个事务,在第一次查询的情况下结果是(5,5,5)
- 但sessionA在第二次查询的时候,缺查出来了3条记录。
- 首先,针对SessionB的更新操作,由于SessionA的读采用的是当前读,所以结果无可厚非,但这种情况不能算作幻读。(第二部分已经澄清何为幻读)
- 那么,针对SessionC的新插入记录在SessionA下,被读取到了,此种情况发生了幻读。
而 考虑间隙锁后,在SeesionA执行如下语句的时候,不仅给记录加上了3个行锁,还加上了4个间隙锁,保证在SessionA提交事务前,不会有新纪录插入进来。
select * from t where b=5 for update
MySQL中的next-key lock相关推荐
- mysql中的unique key和null之间的关系
在mysql 中,唯一约束unique key是为了防止数据重复而设立的.一个表可以有多个唯一约束,但只能有一个主键. 神奇的是,唯一约束竟然可以插入null值,而且可以插入多个null值,这一点令我 ...
- MySQL中 ON DUPLICATE KEY UPDATE语法的使用
MySQL ON DUPLICATE KEY UPDATE 为Mysql特有语法 ON DUPLICATE KEY UPDATE 用法与说明 Mysql中INSERT ... ON DUPLICATE ...
- MYSQL中ON DUPLICATE KEY UPDATE对数据进行insertOrUpdate操作
本文来自:高爽|Coder,原文地址:[url]http://blog.csdn.net/ghsau/article/details/23557915[/url],转载请注明. 向数据库插入记录时,有 ...
- php mysql primary key_简单分析MySQL中的primary key功能_MySQL
在5.1.46中优化器在对primary key的选择上做了一点改动: Performance: While looking for the shortest index for a covering ...
- mysql的hash分区_MySQL中hash和key分区值的计算方法
MySQL中hash和key分区值的计算方法 mysql中有一种叫作key作为partition key的类型.来看看记录是怎么分布的 对于hash 分区,使用%操作符,每个partition key ...
- ibatis mysql 同时删多个表报错_MySQL中Multiple primary key defined报错的解决办法
MySQL中Multiple primary key defined报错的解决办法 创建主键可以有两种方式: create table 表名( 字段名 类型, 字段名 类型, -- primary k ...
- Mysql中key 、primary key 、unique key 与index区别
https://www.cnblogs.com/zjfjava/p/6922494.html 索引被用来快速找出在一个列上用一特定值的行.没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表 ...
- 基础回顾(四)在mysql中的mul
在mysql中mul是Key,而key是键的意思,key分为主键primary key,外键FOREIGN KEY以及一般键,当Key是MUL时,那么该列的值可以重复,并且该列是一个非唯一索引的前导列 ...
- oracle中key,mysql中的key在oracle中是什么
mysql中的key在oracle中是什么 说明一下.key在oracle中对应的是什么? 比如说: CREATE TABLE `AdBanner` ( `BannerId` int(8) NOT N ...
- Mysql中Key与Index的区别
mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的. 1 key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查 ...
最新文章
- 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝
- 昆仑通态9针通讯口定义_MCGS昆仑通态触摸屏常见问题(4)
- 802.11ac标准简介
- C4.5中对于离散和连续特征的判定
- Spring Boot 统一结果封装
- 发布软件之前,怎样告诉用户怎么用
- js文章QQ空间分享
- 转载---Adaboost学习记录
- 360互联网技术训练营第七期 -“遇见”PIKA
- 【车间调度】基于matlab粒子群算法求解生产调度问题【含Matlab源码 485期】
- java ssm商城_SSM网上购物商城系统
- 校园网接无线路由器多账号登录
- 平板电脑也可以学python吗?10 个Python 编辑器,,让编程更贴近生活~
- 免费网站建设应该要掌握哪些?
- 正则表达式-re.error: unbalanced parenthesis at position 7
- 概率论与数理统计 期末突击复习
- Android Studio调用高德地图api
- iOS开发雕虫小技之傻瓜式定位神器-超简单方式解决iOS后台定时定位
- 富文本编辑器mavon-editor文章回显
- 光标飞控硬件架构设计与原理