Mysql 行级锁无索引时变表级锁,真的是这样吗?实测

最近学习Mysql时,发现网上往往说行级锁没有使用索引时会转为表级锁,原因是Mysql行级锁是给索引加锁。但事实真的是这样吗?自己测试了下,发现了一些问题

测试工具:SQLYOG

测试用表:
employees(
id INT(11)
NAME VARCHAR(15))无索引

session1
begin;
select *
from employees
where id =1 lock in share mode;

session2
begin;
update employees
set name = ‘tom’
where id =2;

运行后session2阻塞,似乎确实是表锁。

进行更多测试:
session1
begin;
select *
from employees
where id =1 lock in share mode;
update employees
set name = ‘tom’
where id =2;

有趣的事情发生了,这里修改成功了。

附上一个表级锁的特性的表格:
在这里插入图片描述
这个表应该没啥异议吧,大概。。。

显然,这里不符合表级S锁自己不可写的特性。
另外用lock tables table_name read 加锁测试确实不能写。
测试到这里,我猜测是每一行加了行锁。

进一步证明:
MySQL8.0删除了information_schema.INNODB_LOCKS,添加了performance_schema.data_locks ,这个表能看到事务所持有的锁,那就看看吧。

在8.0中运行以下语句
SELECT * FROM performance_schema.data_locks

结果是大量的行锁和一个意向锁和一些间隙锁supremum pseudo-record,OK,问题结束,没有索引时加行锁会转变成给每一行都加行锁。(其实用快照读也能测出来和lock tables的不一致)

本人Java初学者,测试仅根据自己浅薄的知识,如果有问题,希望大佬们多多批评指正。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值