MySQL 中有哪些锁类型?
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 操作 |
锁的选择取决于实际场景和需求,合理使用锁机制可以在提高性能的同时保证数据一致性。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型
2022-12-15 1945. 字符串转化后的各位数字之和