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

mysql并发导致幻读怎么办_mysql锁与隔离处理方式

梦枫同学_5942

梦枫同学_5942

发布时间:2026-01-26 11:36:10

|

1016人浏览过

|

来源于php中文网

原创

RR隔离级别下幻读未被完全解决:快照读靠MVCC避免幻读,但当前读需next-key lock配合索引才能防止,无索引时仍可能幻读。

mysql并发导致幻读怎么办_mysql锁与隔离处理方式

RR 隔离级别下幻读真的被解决了?

MySQL InnoDB 在 REPEATABLE READ(RR)隔离级别下,**对快照读(普通 SELECT)确实避免了幻读,但对当前读(SELECT ... FOR UPDATE、UPDATE、DELETE)只在加锁范围内防住——漏掉的间隙仍可能出问题。** 很多人误以为“RR 就不幻读”,结果在线上看到两次 SELECT ... FOR UPDATE 返回行数不同,才意识到:不是没幻读,是没锁对范围。

快照读靠 MVCC,但别指望它管写操作

MVCC 通过维护每行的 trx_id(创建版本)和 roll_ptr(回滚指针),配合事务启动时生成的 ReadView,让普通 SELECT 只看到“该事务开始前已提交”的数据快照。所以即使其他事务插入新行,你查不到——这叫“幻读被屏蔽”。

  • ✅ 适用场景:报表统计、后台只读查询、不需要实时一致性的读取
  • ❌ 不适用:你要基于这次查询结果做 INSERT 或 UPDATE,比如“查有没有同名用户,没有就注册”——这时 MVCC 拦不住别人插进来
  • ⚠️ 坑点:SELECT 不加锁 ≠ 安全;如果业务逻辑依赖“查无此记录 → 插入”,必须改用当前读+锁,否则必然竞态

当前读必须用 next-key lock,但索引是前提

要真正阻止幻读,得让 SELECT ... FOR UPDATE 或 UPDATE ... WHERE 锁住“值本身 + 值之间的间隙”。InnoDB 实现这个靠的是 next-key lock(记录锁 + 间隙锁),但它**只在有索引的列上生效**。如果 WHERE 条件走的是全表扫描,InnoDB 可能退化为锁表或锁大量无关间隙,性能崩盘。

MySQL8 CRM Schema Design Expert
MySQL8 CRM Schema Design Expert

面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

下载
SELECT * FROM user WHERE name = '张三' FOR UPDATE;
  • ✅ 有效前提:字段 name 有索引(哪怕非唯一);否则锁不住间隙,别人仍可在“张三”前后插入新记录
  • ✅ 更稳妥写法:用主键或唯一索引精确匹配,如 WHERE id = 123 FOR UPDATE,此时只加记录锁,开销最小
  • ⚠️ 常见错误:WHERE status = 0 却没给 status 建索引 → 锁全表 or 大量间隙 → 并发下降、死锁风险飙升

什么时候该切到 Serializable?真要慎用

SERIALIZABLE 是唯一能 100% 消灭幻读的隔离级别,原理是自动把所有 SELECT 转成 SELECT ... LOCK IN SHARE MODE。但它代价巨大:

  • ❌ 写操作会被读阻塞(反之亦然),TPS 断崖式下跌
  • ❌ 在高并发订单、库存类场景中,极易触发锁等待超时(Lock wait timeout exceeded)
  • ✅ 仅建议:低频、强一致性要求的批处理任务,比如财务日结核对

绝大多数业务,更推荐“RR + 精准索引 + 当前读显式加锁”,而不是一刀切升隔离级别。幻读不是玄学,是锁没锁对地方——查哪段数据,就得锁住那段数据的“存在区间”。

热门AI工具

更多
豆包大模型

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

UpDream
UpDream Hot

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

蛙蛙写作

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

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2473

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1499

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

875

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3532

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

6068

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1299

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6331

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

5462

2023.08.14

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

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

精品课程

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

共1课时 | 194人学习

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

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