【无标题】

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】的数据进行修改。
结果:正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值