深入理解MySQL默认事物隔离级别

 更新时间:2026年03月19日 10:12:26   作者:7ioik  
本文主要介绍了深入理解MySQL默认事物隔离级别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

你想知道 MySQL 的默认事务隔离级别,这是理解 MySQL 并发控制、解决脏读 / 幻读 / 不可重复读等问题的核心知识点。我会从「默认值」「隔离级别分类」「原理验证」「修改方法」四个维度详细讲解,让你不仅知其然,更知其所以然。

一、MySQL 默认事务隔离级别

1. 核心结论

  • InnoDB 引擎(MySQL 默认存储引擎)的默认事务隔离级别是:REPEATABLE READ(可重复读);
  • MySQL 5.1 及以上版本均遵循此规则,这也是 MySQL 与其他数据库(如 Oracle 默认READ COMMITTED)的核心区别之一。

2. 快速验证(实操命令)

你可以直接在 MySQL 客户端执行以下命令,查看当前默认隔离级别:

-- 查看全局/会话级别的默认隔离级别
SELECT @@GLOBAL.transaction_isolation, @@SESSION.transaction_isolation;

-- 旧版本(MySQL 5.6及之前)用这个命令
SELECT @@GLOBAL.tx_isolation, @@SESSION.tx_isolation;

输出示例

@@GLOBAL.transaction_isolation@@SESSION.transaction_isolation
REPEATABLE-READREPEATABLE-READ

二、事务隔离级别的完整分类(ACID 中的 I)

SQL 标准定义了 4 种事务隔离级别,MySQL InnoDB 全部支持,级别从低到高如下(隔离性越强,并发性能越差):

隔离级别脏读不可重复读幻读核心说明
READ UNCOMMITTED(读未提交)最低级别,能读取其他事务未提交的数据,会导致脏读
READ COMMITTED(读已提交)只能读取其他事务已提交的数据,解决脏读,但仍有不可重复读 / 幻读
REPEATABLE READ(可重复读)MySQL 默认,同一事务内多次读取同一数据结果一致,InnoDB 额外解决了幻读
SERIALIZABLE(串行化)最高级别,事务串行执行,完全解决并发问题,但性能极差(几乎不用于生产)

关键概念解释(新手必看)

  • 脏读:读取到其他事务未提交的修改(比如事务 A 改了数据但没提交,事务 B 读到了这个未提交的修改,之后 A 回滚,B 读到的就是 “脏数据”);
  • 不可重复读:同一事务内,多次读取同一数据,结果不一致(比如事务 A 读了数据,事务 B 修改并提交,A 再读就变了);
  • 幻读:同一事务内,多次执行同一查询,返回的行数不一致(比如事务 A 查age=20的用户有 10 个,事务 B 插入 1 条age=20的记录并提交,A 再查就变成 11 个,像 “幻觉”)。

三、MySQL 默认级别(REPEATABLE READ)的核心原理

InnoDB 的REPEATABLE READ之所以能同时解决不可重复读和幻读,核心依赖两个机制:

1. 多版本并发控制(MVCC)

  • 每个事务启动时,会生成一个只读快照(Read View),事务内所有读取都基于这个快照,不受其他事务提交的修改影响,因此能保证 “可重复读”;
  • 快照只对读操作生效,写操作(增删改)仍会锁定数据,保证一致性。

2. 间隙锁(Gap Lock)

  • InnoDB 在REPEATABLE READ级别下,会对索引记录之间的 “间隙” 加锁,防止其他事务插入数据,从而额外解决了幻读(这是 MySQL 对 SQL 标准的增强);
  • 示例:执行SELECT * FROM user WHERE age = 20 FOR UPDATE,InnoDB 会锁定age=20的记录,以及age在 19-21 之间的间隙,阻止插入新的age=20的记录。

四、如何修改事务隔离级别

1. 临时修改(当前会话生效,重启失效)

-- 设置当前会话的隔离级别为读已提交
SET SESSION transaction_isolation = 'READ-COMMITTED';

-- 验证修改结果
SELECT @@SESSION.transaction_isolation;

2. 永久修改(全局生效,需修改配置文件)

编辑 MySQL 配置文件(my.cnf/my.ini):

[mysqld]
# 设置全局默认隔离级别为读已提交
transaction-isolation = READ-COMMITTED

重启 MySQL 服务:

# Linux
systemctl restart mysqld

# Windows
net stop mysql && net start mysql

验证全局配置:

SELECT @@GLOBAL.transaction_isolation;

3. 按事务临时修改(仅当前事务生效)

-- 开启事务前设置
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- 事务内的操作使用读已提交级别
SELECT * FROM user WHERE age = 20;
COMMIT;

五、不同隔离级别的适用场景

隔离级别适用场景优缺点
REPEATABLE READ绝大多数业务场景(电商、后台管理系统等)平衡隔离性和并发性能
READ COMMITTED高并发写场景(如金融交易)、兼容 Oracle 业务并发性能更好,仅解决脏读
SERIALIZABLE数据一致性要求极高的场景(如对账、审计)一致性最好,并发性能极差

总结

  1. 核心默认值:MySQL InnoDB 引擎的默认事务隔离级别是REPEATABLE READ(可重复读),这是平衡隔离性和并发性能的最优选择;
  2. 核心能力:该级别基于 MVCC 解决了不可重复读,基于间隙锁额外解决了幻读,比 SQL 标准的可重复读更强;
  3. 修改方式:可通过SET SESSION/GLOBAL临时 / 全局修改,或修改配置文件永久生效,按需适配业务场景。

到此这篇关于深入理解MySQL默认事物隔离级别的文章就介绍到这了,更多相关MySQL默认事物隔离级别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mysql查询语句详细总结大全

    Mysql查询语句详细总结大全

    这篇文章主要给大家介绍了关于Mysql查询语句详细总结的相关资料,MySQL是一种关系型数据库管理系统,它支持SQL语言进行数据查询,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 从理论到实践详解MySQL中的连表查询和更新

    从理论到实践详解MySQL中的连表查询和更新

    在数据库操作中,连表查询(JOIN)和更新(UPDATE)是两种常见但独立的功能,MySQL 允许我们将这两种操作结合起来,实现基于关联表数据的批量更新,下面小编就和大家详细介绍一下吧
    2026-05-05
  • Mysql使用索引实现查询优化

    Mysql使用索引实现查询优化

    索引的目的在于提高查询效率,本文给大家介绍Mysql使用索引实现查询优化技巧,涉及到索引的优点等方面的知识点,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • MySQL集群高可用架构的两种使用小结

    MySQL集群高可用架构的两种使用小结

    本文介绍了MySQL的两种高可用解决方案:组复制(MGR)和Master High Availability(MHA),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • mysql事务处理用法与实例代码详解

    mysql事务处理用法与实例代码详解

    这篇文章主要介绍了mysql事务处理用法与实例代码详解,详细的介绍了事物的特性和用法并实现php和mysql事务处理例子,非常具有实用价值,需要的朋友可以参考下
    2018-12-12
  • MySQL系列之十三 MySQL的复制

    MySQL系列之十三 MySQL的复制

    这篇文章主要介绍了MySQL系列之十三 MySQL的复制,详细的讲述了多种复制架构的案例和MySQL复制相关概念等,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • phpstudy无法启动MySQL服务的完美解决办法

    phpstudy无法启动MySQL服务的完美解决办法

    学习php当然是要先安装好运行环境了,phpstyudy是一个运行php的集成环境,一键安装对新手很友好,下面这篇文章主要给大家介绍了关于phpstudy无法启动MySQL服务的完美解决办法,需要的朋友可以参考下
    2022-06-06
  • Linux安装MySQL5.6.24使用文字说明

    Linux安装MySQL5.6.24使用文字说明

    这篇文章主要为大家详细介绍了Linux安装MySQL使用文字说明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • SQL注入之报错注入实战演练(适合新手入门)

    SQL注入之报错注入实战演练(适合新手入门)

    在SQL注入报错攻击中,攻击者通过在用户输入的位置注入恶意的SQL代码,使应用程序拼接出错误的SQL语句,这篇文章主要介绍了SQL注入之报错注入的相关资料,需要的朋友可以参考下
    2025-11-11
  • mysql查询使用_rowid虚拟列的示例

    mysql查询使用_rowid虚拟列的示例

    MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUMBER()或变量模拟,且应显式定义主键以确保稳定性,对mysql,_rowid虚拟列相关知识感兴趣的朋友一起看看吧
    2025-06-06

最新评论