当前位置: 首页 > news >正文

Mysql:有哪些锁?

MySQL 中的锁不是一个平铺的分类,可以从三个维度理解:

锁的范围:全局锁、表锁、行锁 锁的模式:共享锁、排他锁、意向锁 锁住的对象:记录、间隙、元数据、自增计数器等

下面主要以最常用的 InnoDB 为例。

一、共享锁和排他锁

1. 共享锁 S Lock

也叫读锁。事务获得共享锁后可以读取数据:

SELECT * FROM users WHERE id = 1 FOR SHARE;

特点:

S 锁和 S 锁兼容 S 锁和 X 锁冲突

多个事务可以同时获得同一记录的共享锁,但不能同时修改它。

2. 排他锁 X Lock

也叫写锁。用于修改或删除数据:

SELECT * FROM users WHERE id = 1 FOR UPDATE; UPDATE users SET age = 20 WHERE id = 1; DELETE FROM users WHERE id = 1;

特点:

X 锁与 S 锁冲突 X 锁与 X 锁冲突

一个事务持有排他锁时,其他事务不能再获得冲突锁。InnoDB 的基本行锁模式就是 S 锁和 X 锁。

二、意向锁

意向锁是表级别的标记,表示事务准备在表中的某些记录上加什么锁。

意向锁含义
IS准备在某些记录上加共享锁
IX准备在某些记录上加排他锁

例如:

UPDATE users SET age = 20 WHERE id = 1;

大致会产生:

users 表上加 IX 锁 id=1 对应索引记录上加 X 锁

意向锁不是为了锁住整张表的数据,而是让 MySQL 快速判断表级锁是否与已有行锁冲突。

兼容关系可以简化为:

ISIXSX
IS兼容兼容兼容冲突
IX兼容兼容冲突冲突
S兼容冲突兼容冲突
X冲突冲突冲突冲突

三、InnoDB 的记录锁

InnoDB 所谓的“行锁”,本质上通常是索引记录锁

UPDATE users SET name = 'Tom' WHERE id = 10;

如果id是主键,就会锁住主键索引中id=10的记录。

主键索引:1 5 [10] 20 ↑ 被锁定

因此索引非常重要。如果没有合适索引,MySQL可能需要扫描并锁住大量索引记录,实际效果可能接近锁住整张表。

四、间隙锁 Gap Lock

间隙锁锁住的是两个索引值之间的空隙,而不是现有记录。

假设索引中有:

10、20、30

间隙包括:

(-∞,10) (10,20) (20,30) (30,+∞)

如果锁住(10,20),其他事务不能在这个范围插入11~19,但通常不影响修改已经存在的1020

间隙锁主要用于防止范围当前读出现幻行。

五、临键锁 Next-Key Lock

临键锁是:

Next-Key Lock = 记录锁 + 记录前面的间隙锁

例如锁住:

(10,20]

意味着同时锁住:

间隙:(10,20) 记录:20

在 RR 隔离级别下执行范围当前读:

SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE;

InnoDB 可能使用 Next-Key Lock 锁住相关索引记录及间隙,阻止其他事务修改已有记录或向查询范围插入新记录。

六、插入意向锁

插入意向锁是一种特殊的间隙锁,表示事务准备向某个间隙插入记录。

索引中存在:

10、20

两个事务分别执行:

INSERT INTO users(id) VALUES (12); INSERT INTO users(id) VALUES (18);

虽然都向(10,20)插入,但插入位置不同,通常可以并发。

如果该间隙已经被其他事务的间隙锁或 Next-Key Lock 锁住,插入意向锁就需要等待。

七、表锁

可以显式锁住整张表:

LOCK TABLES users READ; LOCK TABLES users WRITE; UNLOCK TABLES;
  • READ:当前会话可以读,不能写,其他会话也可以读。
  • WRITE:当前会话可以读写,其他会话通常不能访问。

InnoDB 主要使用行级锁,一般不建议通过LOCK TABLES手动锁住整张 InnoDB 表,因为会明显降低并发能力。

八、元数据锁 MDL

MDL 的全称是 Metadata Lock,用来保护表结构等数据库对象。

事务执行:

START TRANSACTION; SELECT * FROM users;

会获得users的元数据锁。如果事务一直没有结束,另一个会话执行:

ALTER TABLE users ADD COLUMN phone VARCHAR(20);

可能一直等待,并显示:

Waiting for table metadata lock

MDL 防止一个事务使用表时,另一个会话突然删除或改变表结构。事务中的 MDL 通常要等到COMMITROLLBACK才释放,因此未提交的长事务经常造成 DDL 阻塞。

九、AUTO-INC 锁

这是 InnoDB 为AUTO_INCREMENT分配自增值使用的特殊机制:

CREATE TABLE orders ( id BIGINT PRIMARY KEY AUTO_INCREMENT );

多个事务同时插入时,InnoDB 需要协调自增值的分配。是否使用表级AUTO-INC锁、持有多久,取决于插入类型和innodb_autoinc_lock_mode。当前模式支持传统、连续和交错三种分配策略。

十、全局锁和备份锁

全局读锁可以通过以下命令获得:

FLUSH TABLES WITH READ LOCK;

它会对整个 MySQL 实例加全局读锁,通常允许查询但阻止数据修改,常用于某些备份场景:

UNLOCK TABLES;

此外,LOCK INSTANCE FOR BACKUP可以获得实例级备份锁,允许普通 DML 继续执行,但阻止可能破坏备份一致性的部分操作。

http://www.jsqmd.com/news/1378145/

相关文章:

  • 终极指南:免费开源!如何用Ryzen SDT彻底释放AMD处理器的隐藏性能
  • Python驱动COMSOL仿真:MPh库的完整高级应用指南
  • 多数元素问题解析与摩尔投票算法实践
  • 终极免费视频压缩工具:如何释放95%存储空间的完整指南
  • 如何高效下载B站4K大会员视频:完整配置与使用指南
  • 从技术翻唱到自由工作流:掌控复杂系统的工程实践
  • 快速掌握PulseView逻辑分析仪:从入门到精通的完整攻略
  • Loop Engineering:构建可观测、可迭代的AI智能体开发范式
  • 从Claude Code到Fable 5:AI代码助手模型切换的实践评估与决策指南
  • Linux SPI应用层编程实战:从/dev/spidev到ioctl全双工通信
  • 计算机毕业设计之高校图书馆座位管理系统
  • LLM驱动量子编译器:AI自动生成离子阱硬件指令序列实践
  • 如何快速提升魔兽争霸III游戏体验:终极优化解决方案
  • 从零部署与深度配置GitLab:私有化DevOps平台搭建与核心功能解析
  • 一键搞定网页视频下载!VideoDownloadHelper浏览器插件完全指南
  • 3分钟掌握:轻松下载网络视频的免费HLS嗅探工具
  • 线下卖场集体冷清,源氏木语怎么还在砸钱开店? - 优企甄选
  • 如何快速掌握PulseView信号分析工具:面向初学者的完整指南
  • 从零构建C++在线编译器:安全沙箱与系统编程实战
  • 免费SQLite数据库管理工具:DB Browser for SQLite完整使用指南
  • Nacos单机版本地部署指南:从环境配置到服务注册实战
  • 什么是铜陵专业的PP喷淋塔维修源头厂家推荐?一篇读懂其定义、价值与实现路径 - 全域品牌推荐
  • Node.js原生http模块构建Web服务器:从零到部署的完整实践
  • 如何轻松找回遗忘的压缩包密码?开源工具帮你智能解锁加密文件
  • MyComputerManager技术剖析:Windows注册表清理与WPF架构实战指南
  • 芯片设计中的握手协议:从valid/ready到反压机制详解
  • 计算机毕业设计之高校图书馆座位预约管理小程序
  • PyCharm高效调试:Execute Selection与多行输入实战指南
  • Visual Studio 2022下OpenGL开发环境配置全攻略:GLFW+GLAD+GLM
  • Tftpd64揭秘:为什么这款免费开源TFTP服务器成为网络管理员的秘密武器?