当前位置: 首页 > news >正文

MySQL 四种隔离级别:从脏读到幻读的全过程

文章目录

    • 《MySQL 四种隔离级别:从脏读到幻读的全过程》
      • 一、前言:为什么要有隔离级别
      • 二、核心概念回顾
      • 三、四种隔离级别概览表
      • 四、通过时间线理解四种隔离级别
        • (1)READ UNCOMMITTED(读未提交)
        • (2)READ COMMITTED(读已提交)
        • (3)REPEATABLE READ(可重复读)
        • (4)SERIALIZABLE(可串行化)
      • 五、MySQL 各级别的底层实现
      • 六、面试高频问题与答题模板
      • 七、总结


《MySQL 四种隔离级别:从脏读到幻读的全过程》


一、前言:为什么要有隔离级别

大家好,我是程序员卷卷狗。

在数据库中,同时运行多个事务是常态。
如果事务之间完全不隔离,
就会出现 脏读、不可重复读、幻读 等问题。

不同的业务场景,对“性能与一致性”的要求不同。
于是 SQL 标准定义了四种事务隔离级别,用来平衡两者。

一句话概括:

隔离级别 = 性能与一致性的权衡。


二、核心概念回顾

概念含义示例
脏读读到其他事务未提交的数据A 读到 B 尚未提交的修改
不可重复读同一事务多次读取结果不同A 两次读同一行,B 中途修改
幻读同一查询多次执行结果行数不同A 查询符合条件行数,B 中途插入新行

三、四种隔离级别概览表

隔离级别脏读不可重复读幻读实现机制
READ UNCOMMITTED无隔离,读未提交
READ COMMITTED每次读生成新 ReadView
REPEATABLE READ(默认)✅(部分避免)固定 ReadView + 间隙锁
SERIALIZABLE全表加锁,串行执行

✅ 表示可能发生该问题,❌ 表示不会发生


四、通过时间线理解四种隔离级别

假设有两笔事务:

T1(读操作)      T2(写操作)

我们来看它们交叉执行的效果。


(1)READ UNCOMMITTED(读未提交)
时间事务 T1事务 T2
t1查询余额 → 得到 100
t2UPDATE balance=0;(未提交)
t3T1 再次查询余额 → 得到 0❌ 脏读
t4T2 回滚

T1 读到了未提交的数据。

特点:几乎无隔离,性能最高,一致性最差。

一般只用于日志类或临时统计业务。


(2)READ COMMITTED(读已提交)
时间事务 T1事务 T2
t1查询余额 → 得到 100
t2UPDATE balance=0; COMMIT;
t3T1 再次查询余额 → 得到 0❌ 不可重复读

T1 在一个事务中读到了两次不同的结果。

原因:每次 SELECT 都生成新的 ReadView。

Oracle 默认就是 READ COMMITTED,
适用于“读实时性较高”的系统。


(3)REPEATABLE READ(可重复读)
时间事务 T1事务 T2
t1查询余额 → 得到 100
t2UPDATE balance=0; COMMIT;
t3T1 再次查询余额 → 仍然得到 100✅ 可重复读

T1 在同一事务内看到的数据一致,
因为它的 ReadView 只在第一次查询时生成。

但如果 T2 插入一条新数据:

INSERT INTO account (id,balance) VALUES (3,200);

T1 再执行范围查询:

SELECT * FROM account WHERE balance > 100;

→ 可能会看到新的行。
这就是“幻读”。

InnoDB 通过 间隙锁(Gap Lock) + MVCC 共同避免幻读。


(4)SERIALIZABLE(可串行化)

在该级别下,所有读写都被加锁,事务串行执行。
即便是读操作,也会被锁定。

T1: SELECT * FROM account;   -- 加锁
T2: INSERT INTO account ...  -- 阻塞等待

保证绝对一致性,但性能最差。
一般仅用于金融或账务系统。


五、MySQL 各级别的底层实现

隔离级别MVCC锁类型特征
READ UNCOMMITTED无锁脏读可能
READ COMMITTED行锁每次查询新快照
REPEATABLE READ行锁 + 间隙锁默认级别,性能与一致性平衡
SERIALIZABLE表锁串行执行,最安全

六、面试高频问题与答题模板

问题答案要点
Q1:MySQL 默认隔离级别是什么?REPEATABLE READ。
Q2:可重复读如何实现?固定 ReadView + MVCC。
Q3:幻读是什么?事务中重复执行同一查询,行数变化。
Q4:如何避免幻读?InnoDB 通过间隙锁防止插入幻行。
Q5:READ COMMITTED 和 REPEATABLE READ 区别?前者每次查询生成新 ReadView,后者只生成一次。
Q6:SERIALIZABLE 的代价?所有操作加锁,性能最差。
Q7:事务级别怎么修改?SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

七、总结

四种隔离级别是事务控制的核心框架。
它们分别平衡了性能与数据一致性:

隔离级别一致性并发性能常用场景
READ UNCOMMITTED最弱最高日志、临时统计
READ COMMITTEDOracle 默认,OLTP 系统
REPEATABLE READ较高MySQL 默认
SERIALIZABLE最强最低银行、结算场景

一句话记住:

一致性越强,性能越低;性能越高,隔离越弱。

下一篇(第 13 篇),我将写——
《锁机制详解:行锁、表锁、间隙锁、意向锁全解析》
讲透锁的类型、粒度与死锁形成条件,是 MySQL 并发控制的核心环节。


http://www.dtcms.com/a/599027.html

相关文章:

  • 人才网网站建设方案河北建设工程信息网登陆
  • 网站后台不能上传做网站主机选择
  • 网站开发与管理课程设计心得坛墨网站建设
  • 阿里巴巴做网站难吗南京谷歌seo
  • 当 AI 工作流需要“人类智慧“:深度解析 Microsoft Agent Framework 的人工接入机制
  • Linux 内存管理 (3):fixmap
  • 一个视频多平台发布天津网站seo策划
  • 数据管理战略|3数据管理成功的预期衡量标准|螺旋上升
  • 零碳园区的路径选择与方法论:从规划到落地的全链路实践
  • 河间做网站的电话东莞东城社保局电话
  • 晶粒 和晶体、晶格
  • 声网AI技术赋能,智能客服告别机械式应答
  • 国外网站做推广施工企业安全生产评价汇总表最终须由( )签名。
  • 潍坊建设公司网站徐州网站设计制作建设
  • 跨系统流程如何打通?选 BPM 平台认准这三点
  • 三明商城网站开发设计太仓建设网站
  • 电子销售网站报表模块如何做济南润尔网站建设技术公司
  • 域通联达网站网站建设怎样推广
  • wordpress全站启用ssl佛山网络优化推广公司
  • mips简单栈溢出
  • 青岛正规品牌网站制作策划wordpress foxpay
  • 傻瓜式网页制作网站设计制作费的税收编码
  • C语言 数组
  • 东阳实惠营销型网站建设厂家上海网站设计与开发公司
  • 公司网站制作导航西安百度seo
  • C 语言文件读写初探:打开数据之门 [特殊字符]
  • AI Agent 从入门到精通:概念、架构与实战应用
  • 官方网站优化价格免费网站模板 html
  • 免费建网站哪个好陕西网络推广网站
  • PHP中对于(并发/并行)相关概念