mysql8.0
隔离级别 : 读已提交
关闭自动提交
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);
当开启事务时, 对数据库中的数据进行上锁查询, 主要分为两种情况
当查询条件为索引字段时, 是对这条数据上行锁, 当查询条件为非索引字段时, 行锁就会升级为表锁
1. 对索引字段进行查询
id字段是主键索引, 当对id字段进行上锁查询时, 只对id = 1这一行数据进行上锁, 当开启一个新的事务查询id = 2时, 不会进行阻塞, 但是对id = 1查询时就会进行阻塞
2. 对非索引字段进行查询
name字段为非索引字段, 当对name="张三"进行上锁查询时, 上的应该是行锁, 所以当对name="李四"进行查询时, 发生了阻塞
具体请看这篇 : https://www.jianshu.com/p/bf862c37c4c9
https://blog.csdn.net/qq_40378034/article/details/90904573
1. 对索引字段
当对age = 20这条数据进行查询时, 间隙锁的区间为[18,21), 所以18, 19 插入不进去, 21可以插入
2. 对非索引字段
锁全表