MySQL 8.x 隔离级别调整

MySQL 8.x 隔离级别调整

    • [1. 如何查看隔离级别?](#1. 如何查看隔离级别?)
    • [2. MySQL 默认隔离级别是什么?](#2. MySQL 默认隔离级别是什么?)
    • [3. 如何修改隔离级别为 RC (Read Committed)?](#3. 如何修改隔离级别为 RC (Read Committed)?)
      • [方案 A:仅修改当前会话(立即生效,断开重连后恢复默认)](#方案 A:仅修改当前会话(立即生效,断开重连后恢复默认))
      • [方案 B:全局修改(对后续新连接生效,重启 MySQL 后失效)](#方案 B:全局修改(对后续新连接生效,重启 MySQL 后失效))
      • [方案 C:永久修改(修改配置文件,重启生效)](#方案 C:永久修改(修改配置文件,重启生效))
    • [⚠️ 切换到 RC 后的核心变化](#⚠️ 切换到 RC 后的核心变化)

在 MySQL 中,事务隔离级别决定了多个事务并发执行时相互影响的程度。更多详情可参考《MySQL 数据库 隔离级别 详解》。

  • 事务隔离级别决定了在并发访问下,一个事务可以看到其他事务的哪些数据变化。MySQL 支持标准 SQL 的四种隔离级别:
隔离级别 描述 可能发生的问题
READ UNCOMMITTED(读未提交) 可以读取其他事务未提交的数据 脏读
READ COMMITTED(读已提交) 只能读取其他事务已提交的数据 不可重复读
REPEATABLE READ(可重复读) 事务内多次读取同一数据结果相同 幻读(InnoDB 会用 Next-Key Lock 避免幻读)
SERIALIZABLE(可串行化) 最严格,事务串行执行 性能开销大

1. 如何查看隔离级别?

由于 MySQL 不同版本的变量名略有差异(5.7 之前使用 tx_isolation,8.0 之后使用 transaction_isolation),建议使用通用查询方式:

方式一:使用全局函数(推荐,兼容各版本)

sql 复制代码
-- 查看当前会话的隔离级别
SELECT @@transaction_isolation;

-- 查看全局系统的隔离级别
SELECT @@global.transaction_isolation;

方式二:使用 SHOW VARIABLES

sql 复制代码
-- 模糊匹配查询
SHOW VARIABLES LIKE 'transaction_isolation';
-- 或者旧版本(5.7以下)使用
SHOW VARIABLES LIKE 'tx_isolation';

2. MySQL 默认隔离级别是什么?

MySQL 的默认隔离级别是:可重复读 (Repeatable Read, RR)

  • 特点: 在同一个事务内,多次读取同一补偿数据的结果是一致的。
  • 与其他数据库的区别: 像 Oracle 和 SQL Server 的默认隔离级别通常是 读已提交 (Read Committed, RC)
  • 额外增强: MySQL 的 RR 级别通过 Next-Key Locks(间隙锁+行锁) 在很大程度上解决了"幻读"问题。

3. 如何修改隔离级别为 RC (Read Committed)?

可以根据影响范围,选择以下三种修改方式之一:

方案 A:仅修改当前会话(立即生效,断开重连后恢复默认)

如果只想让当前的连接窗口变成 RC 级别,执行:

sql 复制代码
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

方案 B:全局修改(对后续新连接生效,重启 MySQL 后失效)

如果希望整个数据库实例都切换到 RC,但不想重启服务:

sql 复制代码
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

注意:已连接的会话不会改变,只有新创建的连接才会生效。

方案 C:永久修改(修改配置文件,重启生效)

如果希望永久生效,需要修改 MySQL 的配置文件(Linux 下通常是 my.cnf,Windows 下是 my.ini):

  1. 找到 [mysqld] 配置节。

  2. 添加或修改如下行:

    ini 复制代码
    [mysqld]
    transaction-isolation = READ-COMMITTED
  3. 重启 MySQL 服务。


⚠️ 切换到 RC 后的核心变化

从 RR 切换到 RC,数据库行为会发生以下显著变化:

  1. 不再防止不可重复读: 同一个事务内,两次执行同一条 SELECT 可能得到不同结果(如果期间有其他事务提交了修改)。
  2. 性能提升: RC 级别下锁的粒度更小,间隙锁 (Gap Lock) 基本失效,这能减少死锁的概率并提高并发能力。
  3. Binlog 格式要求: 在 RC 级别下,建议将 binlog_format 设置为 ROW(行级格式),否则在主从复制时可能会出现数据不一致。

若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/160532549

相关推荐
wuyk5552 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
文人sec2 小时前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?
数据库·mysql·adb·数据分析
高级程序源2 小时前
django招聘网站信息爬取与分析系统79704-计算机课程设计、毕业设计
后端·python·mysql·小程序·django·flask·课程设计
Omics Pro2 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
旺仔不是程序员3 小时前
相关子查询与性能优化:PostgreSQL 逐行执行的代价与 JOIN 重写
数据库·后端·sql
YangYang9YangYan3 小时前
2026 电商数据运营校招 JD 梳理|岗位任务、技能与面试考点汇总
大数据·数据库·数据分析
Sun 32853 小时前
读懂集中式主备的集群状态与节点角色
数据库·opengauss·集群·节点角色·磐维数据库·运行状态
毕业设计7033 小时前
(免费领源码) SpringBoot 游戏交易平台17600-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·spring boot·mysql·决策树·mybatis·idea·推荐算法
溪语流沙3 小时前
Django + Vue电商项目第001讲:开篇|注册登录加增删改查,那不是电商
redis·python·mysql·docker·typescript·django·vue
努力努力再努力wz4 小时前
【Redis进阶系列】:从主从复制到 Sentinel,一文建立故障检测、Leader 选举与 Failover 的完整心智模型
数据库·redis·缓存