外观
表锁、行锁和读写锁的区别是什么
表锁(Table Lock
)
定义:锁住整张表,其他会话无法对该表进行写操作(读操作可能允许,取决于锁类型)。
粒度:粗粒度锁,锁住整个表。
类型:
- 表级共享锁:允许多个会话同时读取表,但禁止任何会话写入。
- 表级排他锁(
Table Write Lock
):禁止其他会话读取或写入表。
使用场景:
- 适合对整张表进行操作(如备份、表结构变更)。
- 在
MyISAM
存储引擎中默认使用表锁。
优点:实现简单,开销小。
缺点:并发性能差,容易导致阻塞。
例子:
LOCK TABLES my_table WRITE; -- 执行操作 UNLOCK TABLES;
行锁(Row Lock
)
定义:锁住表中的某一行或多行,其他会话可以访问未锁定的行。
粒度:细粒度锁,锁住单行或多行。
类型:
- 行级共享锁(
S Lock
):允许多个会话同时读取同一行,但禁止写入。 - 行级排他锁(
X Lock
):禁止其他会话读取或写入该行。
- 行级共享锁(
使用场景:
- 适合高并发场景,如事务中对特定行的操作。
- 在
InnoDB
存储引擎中默认使用行锁。
优点:并发性能高,锁冲突少。
缺点:实现复杂,开销较大。
例子:
START TRANSACTION; SELECT * FROM my_table WHERE id = 1 FOR UPDATE; -- 执行操作 COMMIT;
读写锁(Read-Write Lock
)
定义:一种锁机制,区分读锁和写锁,用于控制对资源的并发访问。
类型:
- 读锁(
Shared Lock
):允许多个会话同时读取资源,但禁止写入。 - 写锁(
Exclusive Lock
):禁止其他会话读取或写入资源。
- 读锁(
使用场景:
- 适用于需要区分读操作和写操作的场景。
- 在
MySQL
中,读写锁可以应用于表锁或行锁。
优点:提高读操作的并发性。
缺点:写操作会阻塞读操作。
例子:
-- 共享锁(读锁) SELECT * FROM my_table WHERE id = 1 LOCK IN SHARE MODE; -- 排他锁(写锁) SELECT * FROM my_table WHERE id = 1 FOR UPDATE;
区别总结
特性 | 表锁 | 行锁 | 读写锁(共享锁/排他锁) |
---|---|---|---|
锁定范围 | 整个表 | 单行或多行 | 行级或表级 |
性能影响 | 锁冲突高,性能较低 | 锁冲突低,性能较高 | 读操作并发高,写操作低 |
应用场景 | 批量操作、维护操作 | 高并发事务型应用 | 读多写少的场景 |
并发性 | 最低 | 最高 | 中等 |
实现方式 | LOCK TABLES | InnoDB 默认使用行锁 | LOCK IN SHARE MODE 和 FOR UPDATE |
选择合适的锁机制
- 表锁:适用于对性能要求不高且操作简单的场景,如批量数据导入、表重建等。
- 行锁:适用于高并发的事务型应用,如在线交易系统,可以减少锁冲突,提高并发性能。
- 读写锁:适用于读多写少的场景,允许多个读操作并发执行,但写操作会阻塞其他操作。