mysql中有哪些粒度锁

1、表锁

表锁是指锁定时锁定整个表,下一个事务访问该表时,必须等到上一个事务解除锁定后再访问表

特点为粒度大,锁定简单,容易冲突。

MySQL粒度锁详解:InnoDB中的行级别锁和表级别锁

2、行锁

是指锁定时锁定的是表的某行或多行记录,其他事务访问同一表时,只有锁定的记录不能访问,其他记录可以正常访问

特点为粒度小,锁比表锁麻烦,不易碰撞,比表锁支持的并发高

3、记录锁

记录锁也是锁的一种,但记录锁的范围只是表的某个记录,记录锁是事务锁后锁的只有表的某个记录。

4、间隙锁

间隙锁属于锁中的一种,间隙锁在事务上锁后锁定的是表记录的某个区间,表的相邻ID之间出现间隙时形成间隙,遵循左右关闭的原则。

5、临键锁

临键锁也是行锁的一种,是INNODB的行锁默认算法,总之是记录钥匙和间隙钥匙的组合,临时钥匙锁定查询的记录,同时锁定该范围查询内的所有间隙空间,锁定相邻的下一个区间。



如果你在开发MySQL应用时遇到了数据竞争的问题,那么你必须要了解MySQL中的粒度锁。在MySQL中,最常使用的锁是InnoDB引擎的行级别锁和表级别锁。本文将为你详细解析这两种锁的使用方法和适应场景。
一、行级别锁
行级别锁是InnoDB中最常使用的锁。也就是说,锁是针对每行数据的。当多个用户同时读取和修改同一行数据时,行级别锁能够保证数据的一致性和完整性。
1. 使用方法
使用行级别锁非常简单,在我们进行数据修改操作时,只需要使用如下语句即可:
```sql
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
```
这个语句会将要修改的数据行加锁,其它用户想要修改这一行数据时,就必须等待该线程释放锁,才能获取到数据。
2. 适用场景
使用行级别锁有以下几个优点:
1)可并发性高:由于锁是针对每一行数据的,因此可以实现允许多个用户同时访问多行数据,从而提高了并发度。
2)锁粒度细:锁是针对每一行数据的,因此对于只有部分数据需要修改的表来说,锁的范围更小,冲突概率也更小。
3)减少死锁:行级别锁由于锁的范围小,因此在出现死锁时,可以很容易地进行处理,从而减少了死锁的概率。
二、表级别锁
当多个用户同时对同一个表进行修改时,表级别锁是必不可少的。表级别锁是InnoDB中较少使用的锁类型,它是对整个表进行锁定。当多个用户操作同一个表时,任何一个用户都必须等待当前用户完成操作后才能继续进行操作。
1. 使用方法
使用表级别锁语句非常简单,在进行数据修改操作时,只需要使用如下语句即可:
```sql
LOCK TABLES table_name WRITE;
```
这个语句会将要修改的整个表加锁,其它用户想要修改这个表时,就必须等待该线程释放锁,才能获取到数据。
2. 适用场景
使用表级别锁也有以下几个优点:
1)保证数据一致性:由于锁是针对整张表的,因此可以保证整个表的数据一致性。
2)锁范围小:当我们需要修改多张表的时候,使用表级别锁能够将锁的范围缩小,从而减少锁的冲突概率。
3)并发粒度小:锁是针对整个表的,因此在高并发应用场景下,使用表级别锁很容易导致阻塞,降低了并发度,甚至是DB的性能问题的根源。
结语
在我们的日常开发中,对于数据锁的使用,我们需要根据具体的场景选择不同的锁粒度,从而尽可能的达到锁定较少的目的,以确保数据的一致性、完整性,提高应用的并发度。在实践中,合理使用锁将会使我们的应用运行更加高效。