mysql中InnoDB幻读解决方案与机制

 更新时间:2026年03月06日 10:21:23   作者:萧曵 丶  
本文主要介绍了mysql中InnoDB幻读解决方案与机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

InnoDB 主要通过 MVCC(多版本并发控制) 和 Next-Key Lock(临键锁) 机制来解决幻读问题,具体策略取决于事务隔离级别:

1.在可重复读(REPEATABLE READ)隔离级别下

MVCC 机制

  • 通过 Read View 机制实现快照读
  • 事务开始时创建一致性视图,后续读取都基于这个视图
  • 其他事务的插入操作不会影响当前事务的查询结果

Next-Key Lock(临键锁)

  • 记录锁(Record Lock):锁住索引记录
  • 间隙锁(Gap Lock):锁住索引记录之间的间隙
  • 临键锁 = 记录锁 + 间隙锁:锁住记录和前面的间隙

示例

-- 假设表中有记录:10, 20, 30
SELECT * FROM t WHERE id > 15 FOR UPDATE;
-- Next-Key Lock 会锁住范围 (10, 20], (20, 30], (30, +∞]
-- 阻止其他事务在这个范围内插入数据

2.解决幻读的场景分析

情况1:快照读(普通 SELECT)

-- 事务A
BEGIN;
SELECT * FROM users WHERE age > 20;  -- 返回2条记录

-- 事务B
INSERT INTO users (age) VALUES (25); -- 成功,但不影响事务A

-- 事务A再次查询
SELECT * FROM users WHERE age > 20;  -- 仍然返回2条记录(无幻读)

原理:MVCC 保持一致性视图

情况2:当前读(加锁 SELECT)

-- 事务A
BEGIN;
SELECT * FROM users WHERE age > 20 FOR UPDATE;  -- 加Next-Key Lock

-- 事务B尝试插入
INSERT INTO users (age) VALUES (25);  -- 被阻塞,等待锁释放

原理:Next-Key Lock 阻止其他事务插入

3.不同隔离级别的对比

隔离级别幻读解决方案性能影响
READ COMMITTED可能发生幻读
REPEATABLE READMVCC + Next-Key Lock中等
SERIALIZABLE完全串行化

4.实际应用建议

何时能完全避免幻读?

  • 使用 REPEATABLE READ 隔离级别
  • 查询使用索引(否则会锁全表)
  • 当前读操作(FOR UPDATE、LOCK IN SHARE MODE)

注意事项

-- 以下情况可能仍有幻读风险:
-- 1. 混合使用快照读和当前读
BEGIN;
SELECT * FROM t WHERE id > 100;           -- 快照读
UPDATE t SET name = 'test' WHERE id > 100; -- 当前读,可能看到新插入数据

-- 2. 使用 READ COMMITTED 隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

5.监控和调优

-- 查看锁信息
SHOW ENGINE INNODB STATUS;

-- 监控锁等待
SELECT * FROM information_schema.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_WAITS;

-- 优化建议
-- 1. 合理设计索引,减少锁范围
-- 2. 避免长时间事务
-- 3. 必要时使用 SERIALIZABLE 隔离级别

总结

InnoDB 在 REPEATABLE READ 隔离级别下,通过 MVCC 解决快照读的幻读问题,通过 Next-Key Lock 解决当前读的幻读问题。但需要注意事务中混合使用不同读取方式可能带来的不一致性。

到此这篇关于mysql中InnoDB幻读解决方案与机制的文章就介绍到这了,更多相关mysql InnoDB幻读内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • mysql 5.7.21 解压版安装配置图文教程

    mysql 5.7.21 解压版安装配置图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.21 解压版安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • MySQL Join算法原理与性能优化实战指南(最新推荐)

    MySQL Join算法原理与性能优化实战指南(最新推荐)

    本文解析MySQL Join算法原理与性能优化,涵盖嵌套循环、块嵌套循环和哈希连接,分析其优缺点及适用场景,提供索引优化、参数调整等实战策略,助力提升查询效率,感兴趣的朋友跟随小编一起看看吧
    2025-06-06
  • 在EF中使用MySQL的方法及常见问题

    在EF中使用MySQL的方法及常见问题

    这篇文章主要介绍了在EF中使用MySQL的方法及常见问题 的相关资料,需要的朋友可以参考下
    2016-06-06
  • 很全面的Mysql数据库、数据库表、数据基础操作笔记(含代码)

    很全面的Mysql数据库、数据库表、数据基础操作笔记(含代码)

    这篇文章主要为大家分享了很全面的Mysql数据库、数据库表、数据基础操作笔记,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • mysql 表索引的一些要点

    mysql 表索引的一些要点

    这篇文章主要介绍了mysql 表索引的一些注意事项,mysql默认优化不如sqlserver,所以需要优化,而一些成熟的cms为了利益,也不会帮大家数据库优化的很好,需要自己另外设置
    2013-11-11
  • ubuntu下apt-get安装和彻底卸载mysql详解

    ubuntu下apt-get安装和彻底卸载mysql详解

    本文给大家分享ubuntu下apt-get安装和彻底卸载mysql的方法,文中提到了安装mysq命令查看mysql是否运行的命令写法,具体内容详情大家通过本文学习吧
    2017-08-08
  • 深入探索数据库MySQL性能优化与复杂查询相关操作

    深入探索数据库MySQL性能优化与复杂查询相关操作

    数据库MySQL 是一种开源的关系型数据库管理系统,在进行 MySQL 数据库开发过程中,需要深入了解如何进行性能优化和复杂查询,以提高系统的效率和可靠性,本文介绍的非常详细,需要的朋友可以参考一下
    2023-04-04
  • Mysql误删除DELETE数据找回操作指南

    Mysql误删除DELETE数据找回操作指南

    如果我们在数据库中不小心执行了类似"delete from t1"这样的不带where条件的语句,那么整张表的数据就全被删除了,下面这篇文章主要给大家介绍了关于Mysql误删除DELETE数据找回操作的相关资料,需要的朋友可以参考下
    2023-05-05
  • 导致MySQL错误1064的原因及最佳解决方案

    导致MySQL错误1064的原因及最佳解决方案

    用户可以通过修正相关的 SQL 查询来解决 MySQL 语法错误 1064,错误信息本身会突出显示查询中出现问题的行号,常见的修复方法包括检查输入错误的命令、替换已废弃的命令以及处理数据库损坏,本文将解释导致错误 1064 的主要原因,并提供一些经过尝试和验证的解决方案
    2026-03-03
  • MySQL数字的取整、四舍五入、保留n位小数方式

    MySQL数字的取整、四舍五入、保留n位小数方式

    这篇文章主要介绍了MySQL数字的取整、四舍五入、保留n位小数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论