事务隔离级别几乎是 MySQL 面试必问题。
三种并发问题
脏读:读了别人还没提交的数据。别人回滚了,你读到的就是脏数据。
场景:A 转账给 B 100 元,但还没提交。B 查余额发现多了 100。A 回滚了。B 白高兴了。
不可重复读:同一个事务内,两次读同一行数据,结果不一样(别人 Update 了)。
场景:事务 A 读了余额是 500。事务 B 改了余额为 600 并提交。事务 A 再读,变成 600。
幻读:同一个事务内,两次查询,第二次多了一些行(别人 Insert 了)。
场景:事务 A 查了所有余额大于 500 的用户,有 3 个。事务 B 插入了新用户余额 800。事务 A 再查,变成 4 个。
四种隔离级别
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| Read Uncommitted | ✓ | ✓ | ✓ |
| Read Committed | ✗ | ✓ | ✓ |
| Repeatable Read(默认) | ✗ | ✗ | 部分解决 |
| Serializable | ✗ | ✗ | ✗ |
InnoDB 如何实现 Repeatable Read
- MVCC(多版本并发控制):每个事务看到的是一个「快照」,而不是实时数据
- Next-Key Lock:行锁 + 间隙锁,解决幻读问题
面试话术
MySQL 默认是 Repeatable Read。它用 MVCC 实现快照读,保证同一个事务内读到的数据是一致的。对于写操作,用 Next-Key Lock 防止幻读——不仅锁住查询到的行,还锁住行之间的间隙。
别只背表格。能说出 MVCC 和 Next-Key Lock 这两个关键词,面试官就知道你真的懂了。
评论
评论已关闭。