作者:mobiledu2502884677 | 来源:互联网 | 2023-10-12 12:09
最近学习Mysql时,发现网上往往说行级锁没有使用索引时会转为表级锁,原因是Mysql行级锁是给索引加锁。但事实真的是这样吗?自己测试了下,发现了一些问题
经测试
测试用表:
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
结果是大量的行锁(数目和记录数一致),OK,问题结束,没有索引时加行锁会转变成给每一行都加行锁。(其实用快照读也能测出来和lock tables的不一致)
本人Java初学者,测试仅根据自己浅薄的知识,如果有问题,希望大佬们多多批评指正。