讲师中心 微信公众号
AI工具推荐 视频效率加速

什么是MySQL两阶段锁协议2PL_解释事务执行过程中加锁与释放锁的时机

酷浩同学_7312

酷浩同学_7312

发布时间:2026-05-22 12:17:33

|

744人浏览过

|

来源于php中文网

原创

MySQL的两阶段锁协议(2PL)实为强严格两段锁(SS2PL),即事务中所有行锁(含记录锁、间隙锁、next-key锁)均在COMMIT或ROLLBACK时统一释放,不因语句执行完毕而提前释放,以此保障可串行化调度。

什么是mysql两阶段锁协议2pl_解释事务执行过程中加锁与释放锁的时机

MySQL 的两阶段锁协议(2PL)不是一种可选配置,而是 InnoDB 在可重复读(REPEATABLE-READ)及以上隔离级别下默认强制执行的锁生命周期管理规则:事务一旦加了行锁,就不会在语句执行完就释放,而是必须等到 COMMIT 或 ROLLBACK 完成后才统一释放。

2PL 在 InnoDB 中实际就是 Strict 2PL(S2PL)

基础 2PL 理论上允许“增长阶段→收缩阶段”的切换,但 MySQL 实际不这么做。InnoDB 采用的是强严格两段锁(SS2PL),即:

  • 所有行锁(包括 SELECT ... FOR UPDATE、UPDATE、DELETE 触发的记录锁、间隙锁、next-key 锁)都在事务结束时一次性释放
  • 事务运行中不会主动释放任何已持有的行锁,哪怕那条记录早已处理完毕
  • 表级锁(如 LOCK TABLES)除外,它走的是另一套机制,不遵循此规则

这意味着你写一条 SELECT * FROM t WHERE id = 1 FOR UPDATE,然后做一堆其他操作(比如查用户、插日志),只要事务没提交,这把行锁就一直占着 id = 1 这行,别的事务想更新或加锁就会被阻塞。

哪些操作会触发 2PL 行锁?

不是所有查询都加锁。是否加锁、加什么锁,取决于语句类型、隔离级别和索引使用情况:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • SELECT ... FOR UPDATE 和 SELECT ... LOCK IN SHARE MODE:明确加锁,受 2PL 约束
  • UPDATE / DELETE:对扫描并匹配的每行加 X 锁(可能含 gap 锁),即使 WHERE 条件最终不命中,只要扫描过,就先加锁再判断——但注意:在 READ-COMMITTED 下,不匹配的行锁会立即释放;而在 REPEATABLE-READ 下,它们也得等到事务结束
  • 普通 SELECT(无锁提示):在 REPEATABLE-READ 下不加行锁,靠 MVCC 版本快照读;但若走的是唯一索引等值查询且记录存在,InnoDB 可能隐式加 SELECT ... LOCK IN SHARE MODE 级别的锁来防止幻读——这点容易被忽略

释放时机异常情况:不是所有锁都死守到 COMMIT

虽然 SS2PL 是主线,但 InnoDB 对几类锁做了优化释放,不等事务结束:

  • 不匹配 WHERE 条件的行锁:仅在 READ-COMMITTED 隔离级别下生效;REPEATABLE-READ 下仍保留
  • AUTO-INC 锁:只在 INSERT 执行期间持有,语句结束即释放,与事务生命周期无关
  • 某些内部临时锁(如排序缓冲区、文件排序用的磁盘临时表锁):语句级生命周期,非事务级
  • 显式 UNLOCK TABLES:释放当前会话持有的所有表锁,但不影响行锁

特别注意:REPEATABLE-READ 下,哪怕你 UPDATE 了一行又立刻 SELECT 它,这行的锁也不会提前松手——它始终绑定在事务上,直到 COMMIT 落库那一刻才真正交出。

为什么顺序会影响并发性能?

因为锁持有时间 = 从第一条加锁语句开始,到最后一条语句执行完 + COMMIT 的整个跨度。所以:

  • 把热点行(如库存、账户余额)的加锁操作尽量往后放,能缩短其被锁定的时间窗口
  • 例如先查订单状态、再校验权限、最后 UPDATE inventory,比反过来把 UPDATE inventory 放第一个更能减少锁争用
  • 但如果中间有网络延迟、应用层耗时逻辑,锁依然全程挂着——2PL 不感知业务耗时,只认事务边界

真正容易被忽略的点是:你无法通过调整 SQL 顺序“绕过”2PL,只能借它来最小化热点锁的暴露时间;而一旦发生死锁,InnoDB 回滚的是事务中**加锁次数少、代价小**的那个,不是按语句顺序来的。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4603

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

951

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1209

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6581

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3323

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6540

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9001

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1210

2024.04.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn