InnoDB 诡异加锁, 求解惑

问题遇到的现象和发生背景

mysql版本8.0.25, 隔离级别RR

表结构

CREATE TABLE `user`  
(
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `age` int(0) NULL DEFAULT NULL,
  `value` int(0) NOT NULL,
  `uni` bigint(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `value`(`value`) USING BTREE,
  UNIQUE INDEX `uni`(`uni`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

表内记录

idnameagevalue 升序uni
626Dee Kay18360
514Justin Casey Howells771732
880Barb Dwyer704252
440Ed Venture575076
839Bjorn Free756180
问题相关代码
start transaction;
select * from user where value <= 17 for update;

按加锁规则是给遇到的索引加锁
加锁是这样的

img

将sql改为

start transaction;
select id from user where value <= 17 for update;

加锁是这样的

img

从select * 到 select id, 反而多加了个主键的记录锁

个人感觉这id=880这行没必要加索引记录锁, 因为value=42这里已经加上了N-K锁了, 所以id是不能被其他会话更新的, 且只select id, 更新其它字段也可以满足RR隔离级别. 目前不清楚这是BUG还是为了解决其他BUG所作出的优化方案

求解惑

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。