mysql 行锁 表锁 间隙锁

本文章环境 : 

mysql8.0

隔离级别 : 读已提交

关闭自动提交


创建edu表 : 

CREATE TABLE IF NOT EXISTS `edu`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `name` VARCHAR(100) NOT NULL,
   `age` INT NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `edu` ADD INDEX index_name ( `age` );


INSERT INTO edu(name,age) values("张三",18);
INSERT INTO edu(name,age) values("李四",20);
INSERT INTO edu(name,age) values("王五",21);
INSERT INTO edu(name,age) values("赵六",22);
INSERT INTO edu(name,age) values("田七",23);
INSERT INTO edu(name,age) values("老八",26);
INSERT INTO edu(name,age) values("老九",30);
INSERT INTO edu(name,age) values("老十",31);
INSERT INTO edu(name,age) values("十一",35);
INSERT INTO edu(name,age) values("十二",38);

 mysql 行锁 表锁 间隙锁_第1张图片

一 : 行锁

当开启事务时, 对数据库中的数据进行上锁查询, 主要分为两种情况

  • 查询条件为索引字段
  • 查询条件为非索引字段

当查询条件为索引字段时, 是对这条数据上行锁, 当查询条件为非索引字段时, 行锁就会升级为表锁

1. 对索引字段进行查询

mysql 行锁 表锁 间隙锁_第2张图片

 id字段是主键索引, 当对id字段进行上锁查询时, 只对id = 1这一行数据进行上锁, 当开启一个新的事务查询id = 2时, 不会进行阻塞, 但是对id = 1查询时就会进行阻塞

2. 对非索引字段进行查询

mysql 行锁 表锁 间隙锁_第3张图片

 name字段为非索引字段, 当对name="张三"进行上锁查询时, 上的应该是行锁, 所以当对name="李四"进行查询时, 发生了阻塞

二 间隙锁

具体请看这篇 : https://www.jianshu.com/p/bf862c37c4c9

https://blog.csdn.net/qq_40378034/article/details/90904573

1. 对索引字段

mysql 行锁 表锁 间隙锁_第4张图片

 mysql 行锁 表锁 间隙锁_第5张图片

 当对age = 20这条数据进行查询时, 间隙锁的区间为[18,21), 所以18, 19 插入不进去, 21可以插入

mysql 行锁 表锁 间隙锁_第6张图片

mysql 行锁 表锁 间隙锁_第7张图片

2. 对非索引字段

mysql 行锁 表锁 间隙锁_第8张图片

 锁全表

你可能感兴趣的:(mysql)