MySQL 数据库 隔离级别 详解

MySQL 数据库 隔离级别 详解

在 MySQL(InnoDB 引擎) 中,事务隔离级别用来规定:

一个事务在执行过程中,能"看到"其他事务做到哪一步的数据

本质是在 一致性(正确性) 和 并发性能 之间做取舍。

下面我用 问题 → 现象 → 机制 → MySQL 实现方式 的方式,进行讲解。


一、为什么需要隔离级别?

如果多个事务同时操作同一批数据,可能出现以下问题:

并发现象 含义
脏读 读到别人 未提交 的数据
不可重复读 同一行,两次读到 不同值
幻读 同一条件,两次读到 不同行数

隔离级别,就是用来控制这些现象允许到什么程度。


二、MySQL 的 4 种隔离级别(从低到高)

1️⃣ READ UNCOMMITTED(读未提交)

能看到什么?

  • 能看到别人 还没提交 的数据

会出现的问题(或 现象)

  • ❌ 脏读
  • ❌ 不可重复读
  • ❌ 幻读

MySQL 实际情况

InnoDB 几乎不用,只是标准里有


2️⃣ READ COMMITTED(读已提交)⭐常用

能看到什么?

  • 只能看到已提交的数据
  • 每次 SELECT 都"刷新视角"

可能出现

  • ❌ 不可重复读
  • ❌ 幻读(逻辑上)

MySQL 是如何实现的?

  • MVCC
  • 每条 SELECT 生成新的 Read View

锁行为特点

  • 普通 SELECT 不加锁
  • 当前读只加 行锁
  • 没有 Gap Lock

3️⃣ REPEATABLE READ(可重复读,MySQL 默认)⭐

能看到什么?

  • 同一事务中,多次 SELECT 结果一致

解决了什么?

  • ✅ 不可重复读
  • ✅ 幻读(InnoDB 实现)

MySQL 是如何实现的?

  • MVCC(事务级 Read View)
  • Next-Key Lock(当前读)

锁行为特点

  • 普通 SELECT 不加锁
  • 当前读可能锁 行 + 间隙
  • 死锁概率略高

4️⃣ SERIALIZABLE(串行化)

能看到什么?

  • 事务 像串行执行一样

实现方式

  • 普通 SELECT 也会加 S 锁

特点

  • 一致性最强
  • 并发性能最差
  • 实际很少用

三、4 种隔离级别对比总表(必背)

隔离级别 脏读 不可重复读 幻读 实现方式
RU ❌ ❌ ❌ 几乎不用
RC ✅ ❌ ❌ MVCC(语句级)
RR ✅ ✅ ✅* MVCC + 锁
SERIALIZABLE ✅ ✅ ✅ 全锁
  • RR 在 InnoDB 中通过 Next-Key Lock 防幻读

四、用一个例子快速理解差异

初始数据

复制代码
balance = 100

事务 A

开启一个事务,然后进行第一次查询。(不提交)

sql 复制代码
START TRANSACTION;
SELECT balance FROM account;  -- 第一次

事务 B

更新数据。(提交)

sql 复制代码
UPDATE account SET balance = 200;
COMMIT;

事务 A 再读

在之前开启的事务中,进行第二次查询。

sql 复制代码
SELECT balance FROM account;  -- 第二次

对于上述场景,第二次查询结果,在不同的隔离级别中表现如下:

隔离级别 第二次结果
RU 200
RC 200
RR 100
SERIALIZABLE 阻塞

五、幻读在 MySQL 中是怎么处理的?

RR(默认)

  • 快照读:MVCC(看不到新插入)
  • 当前读:Next-Key Lock(插不进)

👉 双保险防幻读


RC

  • 快照读:MVCC
  • 当前读:只锁行,不锁间隙

👉 逻辑上仍可能幻读


六、怎么选隔离级别?(实战建议)

推荐方案

场景 建议
OLTP 高并发 RC
金融 / 强一致 RR
老系统 RR
分析型 RC

📌 越来越多系统选择:

RC + 严格 SQL 规范


七、3 句终极理解口诀

隔离级别,本质是"看世界的方式";
RC 每次刷新世界,RR 世界不变;
越安全,锁越多,并发越差。


八、一句话总结

MySQL 的隔离级别,是通过 MVCC 和锁机制,在一致性与并发性能之间做出的不同权衡。

关于 MVCC 介绍,可参考《MySQL 数据库 MVCC 机制》

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

相关推荐
CS创新实验室1 分钟前
数据库突然断电,凭什么没丢数据?——WAL 日志与崩溃恢复
数据库·mysql
Warolitbos9 分钟前
【数据库】SQL面试基础15题,测试/开发必背速查
数据库
用户849137175471613 分钟前
【技术干货】MySQL联合索引底层原理 | 最左前缀原则详解
mysql·面试
kele_z27 分钟前
手工修改数据库中的数据时,我会加的四道保险
mysql·postgresql
ly76891 小时前
PostgreSQL 执行计划深读:从 EXPLAIN 输出到代价模型驱动的 SQL 改写
数据库·sql·postgresql·explain·执行计划·代价模型
Python自动化直播1 小时前
自动化笔记:素材管理、命名、轮换的几条土办法
linux·运维·数据库
xiaomuzuirenzhen1 小时前
2027校招ERP实施顾问:大数据管理与应用专业如何用SQL、BI证明业务能力
大数据·数据库
eleven_4u1 小时前
MySQL深分页如何处理
mysql
底层玩家老张2 小时前
从副本集到分片:百亿级文档数据的KES架构边界
数据库·分布式架构·分片·架构选型·文档数据库
ss2732 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 16 PostgreSQL子查询与嵌套查询(下)
数据库·笔记·postgresql