MySQL行锁与表锁

x33g5p2x  于2022-05-05 转载在 Mysql  
字(0.5k)|赞(0)|评价(0)|浏览(457)

首先我的数据库中有如下一张student表:

行级锁

这里我开启两个客户端、两个事务去访问数据库。你可以理解为两个用户。

client1:

client2:

那我们怎么证明是行级锁 而不是 表级锁 呢?
我们可以测试一下client2是否能对其它行数据进行写操作:

我们发现 client2 在 对其他行数据进行 写操作时 是不会被阻塞的,因此也就证明 client1 加的是行级锁

client1:

提交事务

client2:

表级锁

先查一下当前表的数据吧

我们再来测试一波

client1:

client2:

为什么这里加的不是行级锁 而是 表级锁呢?

这里我直接给出结论:

如果 where 条件中是索引的话,innodb默认加的就是行级锁
如果where 条件中不是索引, innodb默认加的是表级锁

其实这个也容易理解,加锁的目的无非就是保证并发情况下某些数据不会被多个线程进行同时修改
索引的话,因为可以唯一确定一行数据,就没必要再加表锁了 。因为我们知道当前线程操作的就是具体的某一行数据,就没必要再锁住其他行数据了。
非索引列不具有唯一性,因此锁的是整张表。

范围锁

先查一下当前表的数据吧

client1:

锁住的是范围之内的行数据

client2:

对返回内的数据行进行写操作测试:

范围之外的写操作:

相关文章

最新文章

更多