美文网首页
MySQL InnoDB 锁

MySQL InnoDB 锁

作者: 七秒钟回忆待续 | 来源:发表于2022-07-14 14:48 被阅读0次

锁的类型 https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html

测试表

CREATE TABLE `dev` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `x` int NOT NULL DEFAULT '0' COMMENT 'x',
  `y` int NOT NULL DEFAULT '0' COMMENT 't',
  `z` int NOT NULL DEFAULT '0' COMMENT 'z',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_z` (`z`),
  KEY `idx_y` (`y`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='table';

测试数据

INSERT INTO `dev` (`x`, `y`, `z`) VALUES (2, 22, 222),(4, 44, 444),(6, 66, 666);

版本
select version(); // 输出:8.0.25
select @@SESSION.transaction_isolation; //输出:REPEATABLE-READ

现象1(记录存在的等值查询):
session 1

begin;
select * from dev where y = 44 for update;

session 2

begin;
INSERT INTO `dev` (`x`, `y`, `z`) VALUES (1, 11, 111); // 成功写入
INSERT INTO `dev` (`x`, `y`, `z`) VALUES (1, 22, 200); //  输出: Lock wait timeout exceeded; try restarting transaction
INSERT INTO `dev` (`x`, `y`, `z`) VALUES (4, 44, 400);//  输出: Lock wait timeout exceeded; try restarting transaction
INSERT INTO `dev` (`x`, `y`, `z`) VALUES (5, 55, 555);//  输出: Lock wait timeout exceeded; try restarting transaction
INSERT INTO `dev` (`x`, `y`, `z`) VALUES (6, 66, 600); // 成功写入 

结论1:
锁是加在索引上,算法为next-key lock,是一个左闭右开的区间,因此y=22行不能新写入。其中y=44不是唯一索引,InnoDB 会继续查找到下一个y不等于44的记录,因为是左闭右开,因此数据y=44不能新写入,而y=66可以新写入。

现象2(记录存在的唯一索引的等值查询):
session 1

begin;
select * from dev where z = 444 for update;

session 2

begin;
INSERT INTO `dev` (`x`, `y`, `z`) VALUES (3, 33, 333); // 成功写入

结论2:
记录存在的唯一索引的等值查询,next-key lock会优化为 record lock

现象3(记录不存在的等值查询)
select * from dev where y = 40 for update; // 按照之前的结论:锁的区间应该为 [22, 44)(注意是左闭右开),也就是写入y=22,33是失败的,y=44是成功的

相关文章

  • 淘宝MySQL文档整理

    MySQL · 引擎特性 · InnoDB 事务锁系统简介 MySQL · 引擎特性 · Innodb 锁子系统浅...

  • Innodb的锁

    Innodb的锁是行级锁 mysql delete是否会锁表 MySQL的InnoDB存储引擎支持行级锁,Inno...

  • Mysql

    MySQL InnoDB中使用悲观锁 要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认...

  • Mysql存储引擎Innodb小结

    innodb是mysql支持事务的存储引擎,也是当前mysql默认的存储引擎。innodb支持行级别锁,对并发性事...

  • MySQL面试题 | 附答案解析(十)

    接上篇:锁 5. MySQL中InnoDB引擎的行锁是怎么实现的? 答:InnoDB是基于索引来完成行锁 例: s...

  • InnoDB介绍

    InnoDB介绍 InnoDB是事务安全的mysql存储引擎,也是mysql的默认存储引擎,特点是行锁设计、支持M...

  • MySQL innodb锁

    MySQL自旋锁-spin lock 一篇算是介绍innodb锁比较有条理的文章 https://blog.csd...

  • MySQL InnoDB 锁

    锁的类型 https://dev.mysql.com/doc/refman/8.0/en/innodb-locki...

  • MySql Innodb 锁

    Innodb 锁的分类 按照锁的级别来分有表锁和行数,按照锁的类型来分,有共享锁和排它锁 表锁 S 共享锁,X 排...

  • 如何解决秒杀场景下的超卖问题

    1、利用排他锁解决超卖问题 MySQL InnoDB存储引擎支持事务和行锁。如果不手动开启事务的话,InnoDB会...

网友评论

      本文标题:MySQL InnoDB 锁

      本文链接:https://www.haomeiwen.com/subject/pvbxirtx.html