kyaa111 2022-02-13 22:06 采纳率: 0%
浏览 110
已结题

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-15 11:27
    关注

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


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


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

    评论

报告相同问题?

问题事件

  • 系统已结题 2月21日
  • 修改了问题 2月14日
  • 创建了问题 2月13日

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100