MySql有无索引的行级锁
- version: mysql 8.0
- 查看进行中的锁:data_locks
InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
a.无索引测试
CREATE TABLE `atable` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`created` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
1.案例
事务A | 事务B |
---|---|
begin; | begin; |
select * from atable where id=1 for update; | |
update atable set num=‘22’ where id=2; | |
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction | |
commit; | commit; |
2.结果
事务A在无索引情况下锁住了id=1的数据,按理论是表锁,无法对其他【id!=1】的数据进行修改。同理也不可以修改表结构。
结果:正确
b.加索引测试
ALTER TABLE `test`.`atable`
MODIFY COLUMN `id` int(0) NOT NULL FIRST,
ADD PRIMARY KEY (`id`);
1.案例
事务A | 事务B |
---|---|
begin; | begin; |
select * from atable where id=1 for update; | |
update atable set num=‘22’ where id=2; | |
success | |
update atable set num=‘22’ where id=1; | |
Lock wait timeout exceeded; try restarting transaction | |
commit; | commit; |
2.结果
事务A在无索引情况下锁住了id=1的数据,按理论是行锁,可以对其他【id!=1】的数据进行修改。
结果:正确