MySQL行锁与表锁

MySQL行锁与表锁

    • 行级锁
    • 表级锁
    • 范围锁

首先我的数据库中有如下一张student表:
MySQL行锁与表锁_第1张图片

行级锁

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

client1:
MySQL行锁与表锁_第2张图片
client2:

MySQL行锁与表锁_第3张图片
那我们怎么证明是行级锁 而不是 表级锁 呢?
我们可以测试一下client2是否能对其它行数据进行写操作:
MySQL行锁与表锁_第4张图片
我们发现 client2 在 对其他行数据进行 写操作时 是不会被阻塞的,因此也就证明 client1 加的是行级锁

client1:

提交事务
在这里插入图片描述

client2:
MySQL行锁与表锁_第5张图片

表级锁

先查一下当前表的数据吧
MySQL行锁与表锁_第6张图片

我们再来测试一波

client1:
MySQL行锁与表锁_第7张图片
client2:
MySQL行锁与表锁_第8张图片
为什么这里加的不是行级锁 而是 表级锁呢?

这里我直接给出结论:

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

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

范围锁

先查一下当前表的数据吧
MySQL行锁与表锁_第9张图片

client1:

锁住的是范围之内的行数据
MySQL行锁与表锁_第10张图片

client2:

对返回内的数据行进行写操作测试:
MySQL行锁与表锁_第11张图片

范围之外的写操作:

在这里插入图片描述

你可能感兴趣的:(Mysql,多线程,mysql)