小工具知识网

当前位置: 首页 > 行业知识 > 详细剖析MySQL临键锁

行业知识

详细剖析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(含)

                  session1session2
                  begin;
                  begin;
                  select * from t2 where id>11 and id11 and id11 and num 11 and num 11 and num 11 and num

上一篇:Node.js中的数据加密和安全传输

下一篇:bicon英文怎么读?