ITPub博客

首页 > 数据库 > 数据库开发技术 > 这绝绝是bug吧?不是,这真的是feature。「该锁的不锁,不该锁的乱锁」

这绝绝是bug吧?不是,这真的是feature。「该锁的不锁,不该锁的乱锁」

原创 数据库开发技术 作者:丁奇3306 时间:2024-10-23 09:47:31 0 删除 编辑

本周六直播课《业务并发,锁和死锁》
进技术交流群方式,见文末海报
====正文分割线===

马上要讲到锁的章节,我也去复习下之前自己写的例子。

再看,依然是一眼bug,理解后feature的套路。
贴出来一起复习下。

CREATE TABLE `t` (  `id` int(11) NOT NULL,  `c` int(11) DEFAULT NULL,  `d` int(11) DEFAULT NULL,  PRIMARY KEY (`id`),  KEY `c` (`c`)) ENGINE=InnoDB;
insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);

隔离级别Repeatable-Read。

session1 session2
session3

begin;

select id from t
where c=5
for share;/或lock in share mode





update t set
d=d+1
where id=5;

//Query OK




insert into t
values(7,7,7);
//
locked

session2更新id=5这一行直接过了,而session3插入 id=7 的反而被锁住。该锁的不锁,不该锁的乱锁。【“还有王法吗,还有法律~吗”】

实际上还是跟锁范围有关。
关键词:覆盖索引、聚集索引、间隙锁。

==考虑三秒的分割线==

原因:
session1只锁了
覆盖索引树c上的记录,没有锁住主键索引上id=5这一行,因此不会锁住session2;

但是这里“
覆盖索引树c上的记录”,包括的范围是[5,10), 就把session3堵住了。

==例行海豹:扫码进技术交流群==


原文作者:丁奇3306;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2024-08-07

  • 博文量
    104
  • 访问量
    44852