导读:本期聚焦于小伙伴创作的《mysql中隐式锁定与显式锁定有何区别?分析InnoDB默认加锁策略》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《mysql中隐式锁定与显式锁定有何区别?分析InnoDB默认加锁策略》有用,将其分享出去将是对创作者最好的鼓励。

在MySQL的InnoDB存储引擎中,锁机制是支撑事务ACID特性、控制并发访问的核心组件,其中隐式锁定和显式锁定是两种最基础的锁定类型,而InnoDB的默认加锁策略会根据操作类型和隔离级别自动选择对应的锁定方式。

mysql中隐式锁定与显式锁定有何区别?分析InnoDB默认加锁策略

隐式锁定与显式锁定的核心区别

隐式锁定是InnoDB存储引擎自动为事务添加的锁,不需要用户编写额外的加锁语句,引擎会根据事务的隔离级别、执行的SQL操作类型自动判断需要加的锁类型和范围。比如在默认的REPEATABLE READ隔离级别下,执行普通的UPDATE语句修改某行数据时,InnoDB会自动为这行数据加上排他锁,这个加锁过程对用户完全透明。

显式锁定则是需要开发者通过特定的SQL语句主动申请的锁,常见的显式锁定语句包括SELECT ... FOR SHARESELECT ... FOR UPDATE,这类语句会明确告诉引擎需要对查询到的数据行加上共享锁或者排他锁,锁的持有时间同样遵循事务的生命周期,直到事务提交或回滚才会释放。

对比维度隐式锁定显式锁定
加锁方式InnoDB自动添加,无需用户干预用户通过特定SQL语句主动申请
常见场景普通的DML操作(INSERT、UPDATE、DELETE)需要提前锁定数据避免后续被修改的查询场景
锁类型根据操作自动选择共享锁或排他锁用户可指定共享锁或排他锁
可控性低,由引擎规则决定高,开发者可自定义加锁逻辑

InnoDB默认加锁策略解析

InnoDB的默认加锁策略和事务隔离级别强相关,MySQL默认的隔离级别是REPEATABLE READ,在该隔离级别下,InnoDB的默认加锁规则如下:

普通DML操作的默认加锁

执行INSERTUPDATEDELETE语句时,InnoDB会对涉及的数据行自动加上排他锁(X锁),同时如果是通过索引条件检索数据,会采用行级锁;如果没有使用索引导致全表扫描,则会升级为表级锁(实际是锁住所有行,效果和表锁一致)。

以下是模拟UPDATE操作隐式加锁的示例:

-- 开启事务
START TRANSACTION;
-- 更新id为1的用户余额,InnoDB会自动为id=1的行加上排他锁
UPDATE user_account SET balance = balance - 100 WHERE id = 1;
-- 此时其他事务无法修改id=1的这行数据,也无法对其加共享锁
-- 提交事务后锁自动释放
COMMIT;

普通查询的默认加锁

REPEATABLE READ隔离级别下,普通的SELECT语句默认不会加任何锁,而是通过MVCC(多版本并发控制)机制读取数据的快照版本,因此普通的查询操作不会阻塞其他事务的写操作,也不会被其他事务的写操作阻塞。

显式锁定语句的默认行为

如果使用SELECT ... FOR SHARE,InnoDB会对查询到的数据行加上共享锁(S锁),此时其他事务可以读取这些数据,也可以对这些数据加共享锁,但是不能加排他锁,也就是不能修改这些数据,直到当前事务释放共享锁。

如果使用SELECT ... FOR UPDATE,InnoDB会对查询到的数据行加上排他锁(X锁),效果和DML操作的隐式排他锁一致,其他事务既不能修改这些数据,也不能对其加共享锁或排他锁。

以下是显式加锁的示例:

-- 开启事务
START TRANSACTION;
-- 对id为1的用户数据加共享锁,其他事务可以读但不能修改这行数据
SELECT * FROM user_account WHERE id = 1 FOR SHARE;
-- 对id为2的用户数据加排他锁,其他事务不能读(加锁读)也不能修改这行数据
SELECT * FROM user_account WHERE id = 2 FOR UPDATE;
-- 事务提交后所有锁释放
COMMIT;

间隙锁的默认策略

REPEATABLE READ隔离级别下,InnoDB默认会开启间隙锁(Gap Lock),当使用范围条件检索数据并加锁时,不仅会锁住符合条件的现有数据行,还会锁住这个范围之间的间隙,防止其他事务在这个范围内插入新数据,从而解决幻读问题。如果是唯一索引的等值查询,间隙锁会自动退化,只锁住对应的行。

实际场景中的选择建议

如果只是普通的增删改操作,不需要手动加锁,依赖InnoDB的隐式锁定即可,避免不必要的显式加锁增加锁冲突的概率。如果需要在读取数据后就确保这些数据不会被其他事务修改,比如先查询库存再扣减的场景,可以使用SELECT ... FOR UPDATE显式加排他锁,保证库存操作的原子性。

需要注意的是,显式锁定同样要遵循最小锁定范围的原则,尽量通过索引条件查询需要锁定的数据,避免因为全表扫描导致锁定范围过大,影响整个表的并发性能。

InnoDB隐式锁定显式锁定加锁策略MySQL修改时间:2026-06-13 21:15:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。