MySQL 中有哪些锁类型?

2025-05-19 10:53:51
Avatar for adminadmin

MySQL 中有哪些锁类型?

在 MySQL 中,锁是用于管理并发访问的机制,以保证数据一致性和完整性。MySQL 支持多种类型的锁,按照其粒度和用途可以分为以下几类。

1. 按粒度分类

表锁(Table Lock)

定义:表锁是一种锁住整个表的机制,锁定后其他事务无法对该表进行任何操作,直到锁释放为止。

特性:

粒度大,开销小,容易引发锁争用。

适用于查询较多且修改较少的场景。

分类:

读锁(共享锁):多个事务可以同时读取表,但不能写入。

写锁(排他锁):一个事务对表进行写操作时,其他事务无法进行读或写操作。

语法:

LOCK TABLES table_name READ/WRITE; UNLOCK TABLES;

行锁(Row Lock)

定义:行锁是一种锁住单行数据的机制,仅对某些行进行加锁,允许其他事务操作未加锁的行。

特性:

粒度小,并发性高,锁争用少。

开销大,因为需要更精细的管理。

适用范围:

主要用于 InnoDB 引擎,支持行级锁。

行锁是在索引基础上实现的,未使用索引的查询会锁全表。

2. 按用途分类

共享锁(S 锁 / Shared Lock)

定义:允许事务读取一行数据,多个事务可以同时获得共享锁。

特性:

防止其他事务对该数据进行修改。

使用方法:

SELECT ... LOCK IN SHARE MODE;

排他锁(X 锁 / Exclusive Lock)

定义:允许事务对数据进行修改,其他事务无法同时获得该数据的锁。

特性:

防止其他事务读取或修改数据。

使用方法:

SELECT ... FOR UPDATE;

3. 按锁实现机制分类

意向锁(Intent Lock)

定义:意向锁用于表示事务打算在表级别或行级别加锁,用于加速锁冲突检测。

类型:

意向共享锁(IS):事务打算对某些行加共享锁。

意向排他锁(IX):事务打算对某些行加排他锁。

特性:

提高锁定操作的效率。

仅用于内部管理,用户无法直接使用。

记录锁(Record Lock)

定义:锁住索引中的单个记录(行),用于精确控制某一行数据的并发访问。

特性:

避免同一行的并发修改。

间隙锁(Gap Lock)

定义:锁住索引记录之间的间隙,防止其他事务在间隙内插入新记录。

特性:

防止幻读。

只在事务隔离级别为 可重复读(Repeatable Read) 时使用。

下一键锁(Next-Key Lock)

定义:结合了 记录锁 和 间隙锁,锁住某条记录及其周围的间隙。

特性:

防止其他事务修改或插入记录,解决幻读问题。

默认情况下,InnoDB 使用下一键锁。

4. 特殊锁类型

自增锁(AUTO-INC Lock)

定义:针对含有自增列的表的锁,用于保证自增值的唯一性。

特性:

锁粒度小,适用于单个事务。

当自增列操作完成后立即释放。

MDL 锁(Metadata Lock)

定义:元数据锁用于保护表的结构(如表定义、索引结构)不被其他事务更改。

特性:

在 DDL 操作(如 ALTER TABLE)期间加锁,防止表被其他事务访问。

自动加锁,无需用户干预。

总结

锁类型

粒度

特性

适用场景

表锁

粗粒度

性能高,但并发性差

查询多、写入少的场景

行锁

细粒度

并发性高,但开销大

高并发场景,数据访问量大的场景

共享锁(S 锁)

行/表级

允许读取,禁止写入

只读查询

排他锁(X 锁)

行/表级

允许写入,禁止其他操作

数据修改

间隙锁

索引间隙

防止幻读

隔离级别为可重复读的场景

下一键锁

行+间隙

解决幻读问题

InnoDB 的默认锁机制

自增锁

自增值控制

确保自增列的唯一性

插入含自增列的表

MDL 锁

表元数据

防止表结构被并发修改

DDL 操作

锁的选择取决于实际场景和需求,合理使用锁机制可以在提高性能的同时保证数据一致性。

Copyright © 2088 沙滩足球世界杯_足球世界杯中国 - pfw18.com All Rights Reserved.
友情链接