SQL数据库插入意向锁_并发写入优化
发布时间 - 2026-01-06 00:00:00 点击率:次插入意向锁是InnoDB在INSERT前加的特殊间隙锁,不阻塞其他插入意向锁,仅与间隙锁或临键锁冲突,旨在减少并发插入锁冲突、提升吞吐量,但不当使用易引发死锁或锁等待。
插入意向锁(Insert Intention Lock)是 InnoDB 在执行 INSERT 语句前加的一种特殊间隙锁(Gap Lock),它本身不阻塞其他插入意向锁,只在目标间隙已被其他事务加了互斥的间隙锁或临键锁(Next-Key Lock)时才会等待。它的核心作用是**减少并发插入时的锁冲突,提升写入吞吐量**,但用不好反而会引发死锁或锁等待。
插入意向锁怎么工作的?
当事务尝试向某个索引间隙(比如 id=5 和 id=10 之间)插入新记录时,InnoDB 不直接加传统间隙锁,而是加一个“插入意向锁”,标记“我打算往这儿插”。这个锁和别的插入意向锁兼容——多个事务可以同时在同一个间隙加插入意向锁,互不阻塞。
但它与以下锁冲突:
- 另一个事务在相同间隙上持有间隙锁(如 SELECT ... FOR UPDATE 范围扫描未命中任何行)
- 另一个事务在相同间隙上持有临键锁(如 UPDATE/DELETE 匹配到间隙边界)
例如:事务 A 执行 SELECT * FROM t WHERE id BETWEEN 5 AND 10 FOR UPDATE(没查到数据),会在 (5,10) 加间隙锁;此时事务 B 插入 id=7 就会被阻塞,因为其插入意向锁与该间隙锁冲突。
什么情况下插入意向锁会变成性能瓶颈?
常见于高并发写入
、主键/唯一键分布密集、且存在范围锁操作的场景:
- 批量导入时混用 SELECT FOR UPDATE:比如先查是否存在再插入(“检查后插入”逻辑),若查用范围条件加了间隙锁,后续插入就会排队
- 自增主键 + 高频 INSERT … ON DUPLICATE KEY UPDATE:冲突更新可能触发临键锁,影响相邻插入
- 非唯一索引上的并发插入:若插入值落在同一索引间隙,又恰有其他事务对该间隙加锁,就会卡住
怎么优化并发插入?
关键思路是:**避免让插入意向锁撞上不必要的间隙锁,同时减少锁粒度和持有时间**。
- 用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 替代“先查后插”:绕过显式加锁查询,减少间隙锁引入机会
- 确保插入字段有合适索引:特别是唯一约束字段,让 InnoDB 快速定位冲突位置,避免全表/大范围间隙扫描
- 控制事务粒度:插入操作尽量单事务完成,避免长事务持锁期间其他写入被阻塞
-
必要时关闭 gap lock(谨慎!):设置
transaction_isolation = 'READ-COMMITTED'可禁用间隙锁(除外键和唯一检查外),大幅降低插入意向锁冲突概率,但需确认业务能接受幻读
如何观察插入意向锁是否在起作用?
通过 InnoDB 状态诊断:
- 查
SELECT * FROM information_schema.INNODB_TRX看当前运行事务 - 查
SELECT * FROM information_schema.INNODB_LOCK_WAITS看锁等待链 - 查
SELECT * FROM information_schema.INNODB_LOCKS(MySQL 5.7+ 已废弃,8.0 用performance_schema.data_locks)识别锁类型,插入意向锁显示为INSERT_INTENTION
配合慢日志和应用层埋点,可定位具体哪条 INSERT 被阻塞、等在哪个间隙。
# mysql
# ai
# 性能瓶颈
# sql
# for
# select
# delete
# 并发
# 数据库
# 死锁
# 就会
# 加锁
# 主键
# 多个
# 已被
# 会在
# 落在
# 为其
# 只在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
在线制作视频网站免费,都有哪些好的动漫网站?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
如何快速查询网站的真实建站时间?
如何在腾讯云免费申请建站?
Python高阶函数应用_函数作为参数说明【指导】
如何实现javascript表单验证_正则表达式有哪些实用技巧
如何在阿里云香港服务器快速搭建网站?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
Laravel如何创建自定义中间件?(Middleware代码示例)
高性能网站服务器配置指南:安全稳定与高效建站核心方案
大学网站设计制作软件有哪些,如何将网站制作成自己app?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
JavaScript Ajax实现异步通信
微信公众帐号开发教程之图文消息全攻略
网站制作壁纸教程视频,电脑壁纸网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
javascript如何操作浏览器历史记录_怎样实现无刷新导航
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何基于云服务器快速搭建个人网站?
Laravel Fortify是什么,和Jetstream有什么关系
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何用wdcp快速搭建高效网站?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
个人摄影网站制作流程,摄影爱好者都去什么网站?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
如何在建站主机中优化服务器配置?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
公司网站制作价格怎么算,公司办个官网需要多少钱?
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel如何创建自定义Artisan命令?(代码示例)
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Android滚轮选择时间控件使用详解
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
iOS中将个别页面强制横屏其他页面竖屏
Python文件流缓冲机制_IO性能解析【教程】
浅谈javascript alert和confirm的美化
Laravel如何使用Service Container和依赖注入?(代码示例)
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
深入理解Android中的xmlns:tools属性
如何快速选择适合个人网站的云服务器配置?
上一篇:关于修改用户模式的详细介绍
下一篇:关于SDK基础的详细介绍
上一篇:关于修改用户模式的详细介绍
下一篇:关于SDK基础的详细介绍

