kyaa111 2022-02-21 10:56 采纳率: 0%
浏览 13
已结题

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所作出的优化方案

求解惑

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2022-02-24 09:32
    关注

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


    本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。

    评论

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 创建了问题 2月21日

悬赏问题

  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)