行业知识
详细剖析MySQL临键锁
2026-11-03 03:36:31
来源:互联网转载
推荐阅读文章
- JavaSE系列1️⃣《JavaSE系列教程》
- MySQL系列2️⃣《MySQL系列教程》
- JavaWeb系列3️⃣《JavaWeb系列教程》
- SSM框架系列4️⃣《SSM框架系列教程》
本博客知识点收录于《MySQL系列教程》—>✈️03【锁、事务原理、MVCC】✈️
文章目录
- 2.4 临键锁
- 2.4.1 临键锁的区间测试
- 2.4.2 临键锁-普通列
- 1)间隙锁
- 2)记录锁
- 2.4.3 临键锁-普通索引
- 1)非临界值
- 2)临界值
- 3)范围值
- 2.4.4 临键锁-主键和唯一索引
- 1)非临界值
- 2)临界值
- 3)范围值
- 2.4.5 临键锁总结
2.4 临键锁
2.4.1 临键锁的区间测试
临键锁(Next-Key Lock):临键锁是查询时InnoDB根据查询的条件而锁定的一个范围,这个范围中包含有间隙锁和记录锁;临键锁=间隙锁+记录锁。
其设计的目的是为了解决Phantom Problem(幻读);主要是阻塞insert,但由于临键锁中包含有记录锁,因此临键锁所锁定的范围内如果包含有记录,那么也会给这些记录添加记录锁,从而造成阻塞除insert之外的操作;
Tips:临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。
临键锁锁住的区间为:记录+区间(左开右闭)
左开右闭:不锁住左边,锁右边
测试表:
drop table if exists t2;CREATE TABLE `t2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `num` int(11) , PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB ;INSERT INTO `t2`(`id`, `num`) VALUES (5, 5);INSERT INTO `t2`(`id`, `num`) VALUES (10, 10);INSERT INTO `t2`(`id`, `num`) VALUES (15, 15);INSERT INTO `t2`(`id`, `num`) VALUES (20, 20);-- 创建普通索引create index idx_num on t2(num);-- 创建唯一索引create unique index idx_num on t2(num);-- 删除索引drop index idx_num on t2;
- 区间示意图:
Tips:间隙锁只会阻塞insert,记录锁会阻塞任意的锁(单要注意排他锁和共享锁的关系);
【测试案例-01-间隙锁】
临键锁的触发不仅把条件区间(11-16)的数据行锁住了,还把临键的数据行统统锁住了;锁住的区间为:(10,15]、(15,20]
锁住的id范围:10(不含)~20(含)
session1 session2 begin; begin; select * from t2 where id>11 and id11 and id11 and num 11 and num 11 and num 11 and num
- 区间示意图:
下一篇:bicon英文怎么读?