全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

InnoDB的next-key lock为什么是左开右闭的?

发布时间:2023-10-11 22:48:02
发布人:xqq

一、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。

#it技术干货

相关文章

怎样在MySQL表中存储树形结构数据?

怎样在MySQL表中存储树形结构数据?

2023-10-11
redis似乎并没有“事务”,那些用到“事务”的人在做什么?

redis似乎并没有“事务”,那些用到“事务”的人在做什么?

2023-10-11
mysql inner join为什么不走索引?

mysql inner join为什么不走索引?

2023-10-11
mysql的MEMORY引擎为什么没有redis的应用广泛?

mysql的MEMORY引擎为什么没有redis的应用广泛?

2023-10-11

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取