MySQL 的事务隔离级别,光面试题里就够聊一小时的:默认级别是什么、RC 和 RR 的区别、MVCC 怎么实现、幻读到底解决没有。但真正到了生产环境,很多人其实只在两个时候会想起它——一个是并发发券时出现超发,另一个是线上突然死锁报警。我在排查这些问题的过程中,把隔离级别相关的机制完整梳理了一遍,包括 InnoDB 底层的版本链、ReadView 生成规则、快照读和当前读的差异、间隙锁的死锁副作用,以及主从复制里 binlog 格式和隔离级别之间的历史纠葛。这篇就把这部分内容一次性讲透,适合后端开发、DBA,也适合准备 MySQL 面试的读者。
1. 并发事务的混乱现场:隔离级别到底在防什么
先说一个我实际遇到过的问题。一个多线程扣减余额的定时任务,代码里明明做了事务控制,结果线上还是出现了余额变负数的情况。后来排查发现,问题出在两个事务并发修改同一行数据时,互相没有隔离好——一个事务读到的是另一个事务尚未提交的中间结果。这就是事务隔离性没守住导致的。
1.1 先看一个真实场景
假设账户表里有一个字段 balance = 100,两个事务同时执行:
sql复制-- 事务A
START TRANSACTION;
SELECT balance FROM account WHERE id = 1; -- 读到 100
UPDATE account SET balance = balance - 50 WHERE id = 1;
-- 事务B(并发执行)
START TRANSACTION;
UPDATE account SET balance = balance - 30 WHERE id = 1;
COMMIT;
事务 B 把这行改成了 70 并提交。此时事务 A 还没提交,如果 A 在 UPDATE 之后又执行一次 SELECT balance FROM account WHERE id = 1,它看到的是 50 还是 70?答案取决于隔离级别。在低隔离级别下,A 可能读到 B 刚提交的 70,导致 A 后面基于“余额只有 50”做的判断全部失效。更严重的情况是,A 在 B 提交之前就读到了 B 更新的中间状态,然后基于脏数据继续操作。
这类问题在电商、支付、库存系统里尤其常见。促销场景下多个订单同时扣减库存,如果隔离级别设置不当,就会出现超卖或负库存。隔离级别本质上是事务之间的一道“看不见的墙”,决定了一个事务能多大程度地看到其他事务未提交或刚提交的数据。
1.2 隔离性与三种并发异常
要理解隔离级别,先理解它要解决的三个经典异常。这三个异常分别对应数据可见性的不同错乱程度:
- 脏读(Dirty Read):事务 A 读取了事务 B 尚未提交的数据,之后 B 回滚了,A 读到的就是根本不存在的数据。类比一下就是你看同事在共享文档里打字,但他还没保存,等他说“刚才那段删掉重写”,你已经被错误内容带偏了。
- 不可重复读(Non-Repeatable Read):事务 A 在两次查询之间,事务 B 修改了同一行并提交,A 两次读到同一行的值不一样。类比是你问同事某文件报价,第一次他说 100 块,过五分钟再问变成 90 块,同一个事务内结果不稳定。
- 幻读(Phantom Read):事务 A 按条件查出一批数据,事务 B 插入了一条满足条件的新数据并提交,A 再次按同样条件查询时,结果集里多了一行。注意,幻读和不可重复读的区别在于:不可重复读针对的是同一行的值被改,幻读针对的是结果集的行数变化。
这三种异常的严重程度是递减的:脏读最严重,读到了未提交的假数据;不可重复读其次,读到了同一行数据的不同版本;幻读相对更隐蔽,涉及的是数据集合的变化。隔离级别的设计,就是为了在这三种异常和并发性能之间做取舍。
1.3 一个容易混淆的点:隔离和锁的关系
很多初学者会把隔离级别和锁混为一谈,觉得隔离级别越高锁越多。这个理解方向对,但不够准确。隔离级别是一个“策略层”的概念,而锁和 MVCC 是“实现层”的机制。InnoDB 用两种手段去实现隔离级别:一是加锁,通过锁的互斥来阻止并发访问;二是多版本并发控制,通过数据的多个版本来让读写互不阻塞。
后面讲 MVCC 的时候会看到,MySQL 之所以能在默认级别下保持不错的并发能力,正是因为大部分读取操作走的是 MVCC,只有写操作才真正加锁。隔离级别决定了什么时候该用 MVCC 的快照,什么时候该升级到加锁读。如果把隔离级别理解为“规则”,那锁和 MVCC 就是“执行规则的工具”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 四个隔离级别逐个拆解
SQL 标准定义了四种隔离级别,MySQL 的 InnoDB 都支持,并且每个级别的表现和标准定义略有差异。我对每一个级别最深刻的感受是:级别越低,写并发越宽松,但数据可见性越混乱;
