mysql事务如何防止幻读

P粉602998670
发布: 2025-10-28 16:23:01
原创
338人浏览过
MySQL通过REPEATABLE READ隔离级别下的MVCC和间隙锁防止幻读,执行范围查询时锁定索引间隙,阻止其他事务插入新数据;若需更强一致性,可使用SERIALIZABLE级别使事务串行执行,或在关键查询中显式使用FOR UPDATE加临键锁,确保数据一致性。

mysql事务如何防止幻读

MySQL 通过事务隔离级别和锁机制来防止幻读,关键在于正确选择隔离级别并理解其底层实现。

什么是幻读

幻读是指在一个事务中,前后两次执行相同的查询,第二次查询出现了第一次没有的结果行(通常是其他事务插入的新数据)。这在涉及范围查询时尤为明显。

使用可重复读(REPEATABLE READ)隔离级别

MySQL 默认的隔离级别是 REPEATABLE READ,在这个级别下,InnoDB 引擎通过 多版本并发控制(MVCC)间隙锁(Gap Lock) 来防止幻读。

说明:
  • MVCC 保证事务在执行期间看到的数据一致性,不会读到其他事务提交的新版本数据。
  • 当执行范围查询(如 SELECT * FROM users WHERE age > 20)时,InnoDB 不仅会对已有记录加锁,还会对索引间的“间隙”加锁,防止其他事务插入符合条件的新记录。

例如:事务 A 查询 age > 20 的用户,InnoDB 会锁定相关索引范围,事务 B 无法插入 age=25 的新用户,从而避免幻读。

使用串行化(SERIALIZABLE)隔离级别

如果需要更强的一致性保障,可以将事务隔离级别设为 SERIALIZABLE

小绿鲸英文文献阅读器
小绿鲸英文文献阅读器

英文文献阅读器,专注提高SCI阅读效率

小绿鲸英文文献阅读器 199
查看详情 小绿鲸英文文献阅读器
特点:
  • 所有查询都会自动加上共享锁,写操作需要排他锁。
  • 事务完全串行执行,杜绝了幻读、不可重复读和脏读。
  • 但并发性能下降明显,只适用于对一致性要求极高且并发量不大的场景。

设置方式:
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

合理使用锁机制

在 REPEATABLE READ 下,如果想显式防止幻读,可以在关键查询中使用 临键锁(Next-Key Lock),它是记录锁和间隙锁的组合。

示例:
  • 执行 SELECT * FROM users WHERE age > 30 FOR UPDATE; 时,InnoDB 会锁定满足条件的记录以及它们之间的间隙,阻止新数据插入。
  • 这样即使其他事务尝试插入 age=35 的记录,也会被阻塞直到当前事务结束。

基本上就这些。MySQL 在默认隔离级别下已经能有效防止大多数幻读场景,关键是理解 MVCC 和间隙锁的作用机制,并在必要时通过 FOR UPDATE 或提升隔离级别来加强控制。

以上就是mysql事务如何防止幻读的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号