Yihui’s Blog

你们生产环境的 MySQL 中使用了什么事务隔离级别?为什么?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #事务 #隔离级别 #生产实践 #VIP

一句话答案

示例口径:生产保持 InnoDB 默认的 RR,利用一致性快照保证事务内重复读取稳定,并通过短事务、唯一约束和条件更新保证业务正确;若锁冲突与范围锁是主要瓶颈,也会评估 RC。

面试口语版

这题要按真实项目回答。一个安全示例是:我们使用 REPEATABLE READ,因为核心交易在同一事务内有多次读取,希望结果基于稳定快照;团队也熟悉 InnoDB 在 RR 下的 MVCC 和 next-key lock 行为。业务正确性不只依赖隔离级别,库存使用带条件 UPDATE,唯一性使用唯一索引,事务尽量短并做死锁重试。如果系统写并发很高、范围锁和死锁明显,而业务允许每条语句看到最新已提交数据,会经过压测后改用 READ COMMITTED。修改前必须验证所有先查后写逻辑。

原理拆解

选择优势风险/要求
RR同事务快照稳定;MySQL 默认next-key lock 可能扩大锁范围
RC每次语句读最新已提交;间隙锁通常更少同事务两次读可能不同

关键细节

  • 不要声称“RR 完全没有幻读”,应区分快照读和当前读。
  • 隔离级别不能替代唯一约束、幂等、条件更新和正确锁定。
  • 可用 SELECT @@transaction_isolation 核对实际会话配置,不能只看配置文件。

面试官追问

  1. RC 与 RR 的 Read View 创建时机有何不同?
  2. 为什么 RC 可能减少死锁?
  3. 如何防止库存超卖?

高分补充

回答“为什么”时给出业务不变量、冲突模型和压测数据,比只说“因为这是默认值”更有说服力。

学习清单

  • 将本文口径替换为自己的真实项目选择和案例。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts