【MySQL】innodb行锁变表锁

关于下文中的表格看法,按照时间轴排列的
【MySQL】innodb行锁变表锁_第1张图片

InnoDB 行级锁是通过给索引上的索引项加锁来实现的,InnoDB行级锁只有通过索引条件检索数据,才使用行级锁;否则,InnoDB使用表锁
在不通过索引(主键)条件查询的时候,InnoDB是表锁而不是行锁。

创建表

创建一个没有主键的表

CREATE TABLE `test_no_key` (
`f1`  int(11) NOT NULL ,
`f2`  varchar(11)  DEFAULT NULL 
)
ENGINE=InnoDB

插入俩条数据


insert into from test_no_key (f1,f2) values (1,2);

insert into test_no_key (f1,f2) values (2,2);

开启俩个进程

【MySQL】innodb行锁变表锁_第2张图片

案例1

就是在没有使用索引的情况下InnoDB就会使用表级锁(共享锁不会有这个情况)

进程1 进程2
begin begin
【MySQL】innodb行锁变表锁_第3张图片 【MySQL】innodb行锁变表锁_第4张图片
【MySQL】innodb行锁变表锁_第5张图片
会出现等待在这里插入图片描述
进程1执行提交在这里插入图片描述
【MySQL】innodb行锁变表锁_第6张图片

案例2

给表加上主键
【MySQL】innodb行锁变表锁_第7张图片
这个测试可以看到,当有主键时,是行锁,只会对一条数据进行加锁

进程1 进程2
【MySQL】innodb行锁变表锁_第8张图片
【MySQL】innodb行锁变表锁_第9张图片
【MySQL】innodb行锁变表锁_第10张图片

案例3

如果查询的条件没有带索引,那么行锁则会转为表锁即时表中字段有主键;所以在查询的时候建议使用索引字段查询

查看表数据
【MySQL】innodb行锁变表锁_第11张图片

进程1 进程2
【MySQL】innodb行锁变表锁_第12张图片
在这里插入图片描述
在这里插入图片描述
【MySQL】innodb行锁变表锁_第13张图片

你可能感兴趣的:(Mysql,Mysql系统学习)