首先我的数据库中有如下一张student
表:
这里我开启两个客户端、两个事务去访问数据库。你可以理解为两个用户。
client1:
client2:
那我们怎么证明是行级锁
而不是 表级锁
呢?
我们可以测试一下client2
是否能对其它行数据进行写操作:
我们发现 client2
在 对其他行数据进行 写操作时 是不会被阻塞的,因此也就证明 client1
加的是行级锁
client1:
提交事务
client2:
先查一下当前表的数据吧
我们再来测试一波
client1:
client2:
为什么这里加的不是行级锁 而是 表级锁呢?
这里我直接给出结论:
如果 where 条件中是索引的话,innodb默认加的就是行级锁
如果where 条件中不是索引, innodb默认加的是表级锁
其实这个也容易理解,加锁的目的无非就是保证并发情况下某些数据不会被多个线程进行同时修改
索引的话,因为可以唯一确定一行数据,就没必要再加表锁了 。因为我们知道当前线程操作的就是具体的某一行数据,就没必要再锁住其他行数据了。
非索引列不具有唯一性,因此锁的是整张表。
先查一下当前表的数据吧
client1:
锁住的是范围之内的行数据
client2:
对返回内的数据行进行写操作测试:
范围之外的写操作:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_45464560/article/details/124485246
内容来源于网络,如有侵权,请联系作者删除!