← 每日面试题 学习看板

为什么MySQL默认使用RR隔离级别?

面试题/03数据库中间件/01MySQL/01数据库基础概念与核心特性/为什么MySQL默认使用RR隔离级别?.md

面试记录 2026-09-17

题目:为什么 MySQL 默认使用 RR 隔离级别?

难度:medium

标签:db/mysql/concepts, mysql/isolation, difficulty/medium

评分:⭐☆☆☆(1/5)

我的回答

MySQL 默认使用 RR,也就是可重复读,这个级别是为了保证一定的效率,并且提升事务支持的能力。因为 RR 级别的事务隔离级别可以有效的处理大多数的事务问题,包括脏读、一部分类型的幻读,基本都能处理。所以它使用 RR 级别,并且它没有串行化那么高的对性能的影响,它还可以提供一定性能保证。当然如果性能要求很高,可以降低 15 个零级别,自己进行配置。

点评

优点:

不足:

  1. RR 通过 MVCC 实现快照读,读不阻塞写——即使一致性高也不牺牲太多性能
  2. RR 通过 next-key lock 大部分解决幻读,业务代码不用额外处理一致性
  3. 兼容 Oracle 生态:Oracle 11g 前默认也是 RR

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:理解 MySQL 选 RR 的技术权衡(MVCC 让 RR 也能保持高并发)与历史背景(兼容 Oracle),而不是"性能优先"。

知识点拆解:

  1. 四种隔离级别的性能谱系(从低到高):
  1. MySQL 默认 RR 的核心原因:
  1. 为什么不是 RC?
  1. 为什么不是 Serializable?
  1. 实际互联网公司为什么常用 RC?
  1. 切换隔离级别的方式:
  1. 实际工程建议:

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 切到 RC 后,哪些场景会出问题?
  1. RC 下并发插入同一个唯一键会不会重复?
  1. MySQL 8.0 是否推荐切 RC?

第三部分:面试者参考回答(口语化)

面试官您好,MySQL 默认用 RR 隔离级别,其实是一个一致性与性能的折中选择,不是"性能优先"。

为什么不是最严格的 Serializable? 因为 Serializable 所有 SELECT 都要加 S 锁,事务完全串行,性能太差,实际几乎没人这么用。

为什么不是更轻量的 RC? 因为 RC 只加行锁没有间隙锁,业务代码会遇到不可重复读和幻读,很多业务逻辑依赖"事务内读到稳定数据"这个假设,切到 RC 会暴露更多一致性问题,业务代码容易踩坑。

为什么 RR 是合适的默认? 有三个技术原因:

第一,InnoDB 的 MVCC 让 RR 也能保持高并发。RR 的快照读通过 ReadView 判断可见性,不加锁,所以读性能没损失。即使是 RR,普通 SELECT 也是并发执行的。

第二,RR 通过 next-key lock 大部分解决了幻读。虽然 RR 并不能完全消除幻读(快照读+当前读混用仍可能遇到),但业务代码写起来不用手动处理一致性,默认更安全。

第三,兼容 Oracle 生态。Oracle 11g 之前默认也是 RR,MySQL 选择 RR 是历史延续。很多传统业务迁移过来时不需要改隔离级别。

但实际互联网公司很多切到 RC,这是另一回事:

所以我的建议是:默认保留 RR,遇到死锁或锁等待问题再切 RC,前提是业务代码不依赖严格可重复读。切 RC 之前要评估有没有跨表一致性查询、有没有依赖间隙锁防重插入的逻辑。金融账务这类强一致业务还是保持 RR。

https://chat.deepseek.com/share/ua60jdf5y3m2my00j5