InnoDB的next-key lock为什么是左开右闭的?
一、InnoDB的next-key lock为什么是左开右闭的
InnoDB的next-key lock本身的设计方案就是左开右闭的,例如
select * from t where c2 = 10 for update;
则锁定的是 c2=10 这条记录本身,以及其索引节点上 c2=10 前面的那个gap。
但在RR隔离级别中,为了避免发生幻读,需要把所有可能插入 c2=10 这个值的位置都加上锁,所以对 i=10 后面的gap也会加锁。
例如,当前t表上的值有以下(id列是主键,c2列是普通索引,c3列无索引)
id c2 c3
1 1 1
2 3 2
10 5 10
15 15 15
20 10 20
30 20 20
那么对于 c2 这个辅助索引,其索引记录真实的值是下面这样的(要包含id列值,innodb的特性决定的)
c2 id
1 1
3 2
5 10
10 20
15 15
20 30
那么上面的加锁请求
select * from t where c2 = 10 for update;
真正要加锁的范围是 (5, 15),也就是说,除了 c2 = 10 这条记录外,还要对 5~10、10~15这两个gap也加上锁,才能保证(RR隔离级别)事务期间,这两个gap也不会插入c2=10的记录,而导致发生幻读。
延伸阅读:
二、InnoDB是什么
InnoDB 是 MySQL 上名列前茅个提供外键约束的数据存储引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。
InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池,能缓冲数据和索引,InnoDB 还把数据和索引存放在表空间里面,可能包含好几个文件,这和 MyISAM 表完全不同,在 MyISAM 中,表被存放在单独的文件中,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。

猜你喜欢LIKE
相关推荐HOT
更多>>
分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储?
一、分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储(1)实现存储的最简单方法是添加一个订阅通配符主题的附加客户端(在MQTT中恰好是#)...详情>>
2023-10-14 22:44:14
数据库种类有哪些?
一、数据库的种类1、关系型数据库(RDBMS)关系型数据库使用表格(二维结构)来组织和存储数据。它们使用结构化查询语言(SQL)进行数据管理和...详情>>
2023-10-14 22:12:41
对数量庞大的照片进行分类管理,较好的方便检索的方法是什么?
一、对数量庞大的照片进行分类管理其实无论任何方法,其实本质都是一样的,就是给照片打上标签,然后按标签分类这些照片(人脸识别也好,地理标...详情>>
2023-10-14 17:18:27
在数据库中,schema、catalog分别指的是什么?
一、在数据库中,schema、catalog分别指的是什么这么说吧,在关系型数据库中,分三级:database.schema.table。即一个数据库下面可以包含多个sc...详情>>
2023-10-14 16:43:29热门推荐
Shell点文件可以为你做点什么?
沸什么是 DMAIC 方法,优点有哪些?
热分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储?
热数据库种类有哪些?
新web前端和UI前端的区别?
Java并发中什么是可见性?
Java中private,默认,protected,public修饰符的区别?
InnoDB的next-key lock为什么是左开右闭的?
Chromium是什么?
为什么分布式数据库这么喜欢用kv store?
web测试流程的重点是什么?
Android开发中为什么很少使用JSON存储数据?
为什么要有U-Boot?
对数量庞大的照片进行分类管理,较好的方便检索的方法是什么?
技术干货






