mysql锁有哪些类型_mysql锁分类解析
发布时间 - 2026-01-05 00:00:00 点击率:次MySQL锁是分层多维的并发控制机制,按粒度分表锁、行锁、间隙锁,按行为分S/X/IS/IX锁,按逻辑分悲观与乐观锁,MVCC提供快照读;常见问题源于隔离级别、索引缺失或事务使用不当。
MySQL锁不是一种锁,而是一套分层、多维、按需启用的并发控制机制;实际开发中你遇到的“卡住”“死锁”“查不到最新数据”,几乎都和它有关。
按粒度分:表锁、行锁、间隙锁,别乱用
粒度决定并发能力——越细越快,但也越难管。
-
表锁(LOCK TABLES t1 READ/WRITE):整张表被锁死,其他事务连SELECT都可能被阻塞(尤其WRITE锁)。MyISAM 默认用它;InnoDB 仅在没走索引、全表扫描或显式调用时才退化为表锁。 -
行锁(InnoDB 默认):只锁命中索引的那几行。但注意:没索引 = 没行锁,InnoDB 会直接升级为表锁。 -
Gap Lock和Next-Key Lock:只在REPEATABLE-READ隔离级别生效,用于防止幻读。比如WHERE id BETWEEN 10 AND 20,会锁住 (10,20) 这个间隙,甚至 (10,20](含20行)。READ-COMMITTED下这些锁不生效,行锁退化为纯Record Lock。
按行为分:S锁、X锁、IS/IX锁,必须懂意向锁的作用
你写 SELECT ... FOR UPDATE 加的是 X 锁,但 InnoDB 实际上先申请 IX 表级意向锁——这是为了快速判断“这张表有没有人正在改行”,避免每次加行锁都扫全表。
-
S锁(共享锁):SELECT ... LOCK IN SHARE MODE加的,允许多个事务同时读,但谁都无法加 X 锁。 -
X锁(排他锁):UPDATE、DELETE、SELECT ... FOR UPDATE默认加的,互斥一切其他锁。 -
IS/IX锁是“预告”:事务还没锁行,但声明“我马上要锁几行读/写”,让表级操作(如DROP TABLE)能立刻感知冲突并拒绝,而不是等到最后才发现。
按实现逻辑分:悲观锁 vs 乐观锁,别拿 version 字段硬套 InnoDB
InnoDB 的行锁是典型的悲观锁实现;而所谓“乐观锁”,MySQL 本身不提供原生命令,version 字段方案是你自己在应用层写的逻辑,数据库只负责执行 UPDATE ... WHERE version = ? 并返回影响行数。
- 真用悲观锁?确保 SQL 走索引、事务尽量短、避免
SELECT ... FOR UPDATE后长时间不提交。 - 想用乐观锁?别依赖 MySQL 自动处理,
UPDATE必须带WHERE version = xxx,且检查affected_rows == 1,否则就是更新丢失。 - MVCC 不是乐观锁,它是快照读机制
:普通 SELECT不加锁,靠隐藏字段DB_TRX_ID和DB_ROLL_PTR回溯版本——这正是为什么你UPDATE未提交时,别人SELECT还能看见旧值。
实战中最容易踩的三个坑
很多“锁表现异常”,其实不是锁错了,而是没看清隔离级别、索引状态或事务边界。
- 在
READ-COMMITTED下还指望Gap Lock防幻读?不行。它只在REPEATABLE-READ生效。 - 执行
UPDATE t SET x=1 WHERE y=999卡住?先EXPLAIN看是否走了索引;没走,就等于锁了全表。 - 用
FOR UPDATE却发现没锁住?确认语句是否在事务内(BEGIN/START TRANSACTION),且事务没提前COMMIT或ROLLBACK。
锁不是配置项,是执行路径的副产品;真正要盯的,永远是那条 SQL 走不走索引、跑在什么隔离级别、包没包在事务里。
# mysql
# ai
# 常见问题
# 为什么
# sql
# for
# select
# delete
# 并发
# table
# 数据库
# 多维
# 死锁
# 只在
# 锁住
# 的是
# 几行
# 这是
# 还没
# 走了
# 多个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Firefox Developer Edition开发者版本入口
手机网站制作与建设方案,手机网站如何建设?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
Linux系统命令中screen命令详解
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel storage目录权限问题_Laravel文件写入权限设置
图册素材网站设计制作软件,图册的导出方式有几种?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
简单实现Android验证码
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
如何登录建站主机?访问步骤全解析
详解jQuery中基本的动画方法
Android中AutoCompleteTextView自动提示
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
简历没回改:利用AI润色让你的文字更专业
C++用Dijkstra(迪杰斯特拉)算法求最短路径
公司网站制作价格怎么算,公司办个官网需要多少钱?
Linux安全能力提升路径_长期防护思维说明【指导】
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
JS实现鼠标移上去显示图片或微信二维码
如何为不同团队 ID 动态生成多个独立按钮
米侠浏览器网页背景异常怎么办 米侠显示修复
Laravel如何发送系统通知?(Notification渠道示例)
南京网站制作费用,南京远驱官方网站?
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
如何在Windows服务器上快速搭建网站?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
如何在阿里云域名上完成建站全流程?
Laravel如何使用Gate和Policy进行授权?(权限控制)
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel distinct去重查询_Laravel Eloquent去重方法
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel如何实现本地化和多语言支持?(i18n教程)
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel如何处理和验证JSON类型的数据库字段
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel如何实现API资源集合?(Resource Collection教程)
Python文件操作最佳实践_稳定性说明【指导】
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
如何在Windows环境下新建FTP站点并设置权限?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
高防服务器如何保障网站安全无虞?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
jquery插件bootstrapValidator表单验证详解
linux写shell需要注意的问题(必看)
高性价比服务器租赁——企业级配置与24小时运维服务
香港服务器租用费用高吗?如何避免常见误区?


:普通