c语言编程笔录

首页 >   > 笔记大全

笔记大全

mysql中有哪些粒度锁

更新时间:2023-12-06

前言:

在MySQL中,粒度锁是一种用于控制并发访问的机制。它可以将数据划分为不同的粒度,并对每个粒度上的数据进行加锁,以确保并发执行的事务之间不会相互干扰。MySQL中包含了多种粒度锁,每种粒度锁都有其特定的应用场景。

1. 表级锁:

表级锁是MySQL中最大粒度的锁定方式。当事务获得了表级锁后,其他事务无法对该表进行任何读写操作。表级锁可以分为两种不同的类型:共享锁(S锁)和排他锁(X锁)。

共享锁(S锁):多个事务可以同时获取同一表的共享锁,允许并发的读操作。获取共享锁的事务之间不会相互阻塞,但不能获取排他锁。

排他锁(X锁):只有当没有其他事务持有S锁或X锁时,事务才能获取X锁进行读写操作。获取X锁的事务会阻塞其他事务的读写操作。

-- 对整个表加共享锁
LOCK TABLES <表名> READ;

-- 对整个表加排他锁
LOCK TABLES <表名> WRITE;

-- 解锁
UNLOCK TABLES;

2. 行级锁:

行级锁是最细粒度的锁定方式,它可以在表的行级别上对数据进行加锁。与表级锁不同,行级锁在事务并发执行时只锁定需要操作的行,而不是整个表。

行级锁的实现依赖于存储引擎,MySQL中的InnoDB存储引擎支持行级锁。在InnoDB中,行级锁可以分为共享锁(S锁)和排他锁(X锁)。

共享锁(S锁):多个事务可以同时获取同一行的共享锁。当事务持有共享锁时,其他事务也可以获取相同行的共享锁,但不能获取排他锁。

排他锁(X锁):只有当没有其他事务持有S锁或X锁时,事务才能获取X锁进行对该行的读写操作。获取X锁后,其他事务无法获取该行的任何锁。

-- 查询时加共享锁
SELECT * FROM <表名> WHERE <条件> LOCK IN SHARE MODE;

-- 更新时加排他锁
SELECT * FROM <表名> WHERE <条件> FOR UPDATE;

-- 解锁
COMMIT;

总结:

MySQL中的粒度锁包括表级锁和行级锁。表级锁是最大粒度的锁定方式,可以控制整个表的并发访问。行级锁是最细粒度的锁定方式,可以在表的行级别上对数据进行加锁。使用不同的粒度锁可以根据具体情况提高并发性能和数据一致性。

在使用粒度锁时,需要根据具体业务场景选择合适的锁定粒度,避免过度锁定或无法保证数据一致性的情况。同时,需要注意锁定粒度过细可能导致锁争用的问题,降低并发性能。

另外,MySQL的粒度锁实现依赖于存储引擎,不同的存储引擎可能支持不同的锁定粒度。在使用粒度锁时,需要了解存储引擎的特性和限制,选择合适的存储引擎。