网盘地址:https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g(点击蓝色链接获取面试资料大礼包)
数据库事务隔离问题:脏读、幻读与不可重复读
在数据库面试中,事务隔离级别相关的知识点几乎是必考题。尤其是脏读、幻读和不可重复读这三个经典问题,面试官往往会要求候选人口述它们的定义、区别以及对应的解决方案。本文将从实际场景出发,帮你梳理这些问题的核心要点。

一、什么是脏读(Dirty Read)?
脏读指的是一个事务读取了另一个事务未提交的数据。例如:
- 事务A修改某行数据但未提交
- 事务B读取到这条未提交的修改
- 事务A回滚,导致事务B读取到错误数据
这种情况常见于读未提交(Read Uncommitted)隔离级别。解决脏读需要提升隔离级别到读已提交(Read Committed),此时事务只能读取已提交的数据。
二、不可重复读(Non-Repeatable Read)的本质
不可重复读指在同一事务中,多次读取同一数据得到不同结果。例如:
- 事务A第一次读取某行数据
- 事务B修改该数据并提交
- 事务A再次读取时发现数据变化
与脏读不同,这里读取的是已提交的数据。通过将隔离级别提升到可重复读(Repeatable Read),MySQL等数据库通过MVCC多版本并发控制机制保证同一事务内读取的数据快照一致。

三、幻读(Phantom Read)的特殊性
幻读的核心在于新增或删除数据导致结果集变化。例如:
- 事务A查询年龄>20的用户(得到10条记录)
- 事务B插入一条年龄=25的新用户并提交
- 事务A再次查询时得到11条记录
虽然可重复读隔离级别通过行锁防止已有数据被修改,但无法阻止新数据的插入。在MySQL中,**串行化(Serializable)隔离级别通过间隙锁(Gap Lock)**解决幻读问题。
四、四种隔离级别对比
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | |------------------|------|------------|------| | 读未提交 | ❌ | ❌ | ❌ | | 读已提交 | ✅ | ❌ | ❌ | | 可重复读(默认) | ✅ | ✅ | ❌ | | 串行化 | ✅ | ✅ | ✅ |
五、如何回答面试追问?
当面试官问"MySQL默认隔离级别是什么?如何解决幻读?"时,可以这样回答:
- MySQL默认使用可重复读隔离级别
- 通过MVCC+Next-Key Lock(行锁+间隙锁)的组合避免幻读
- 但严格来说,在可重复读级别下仍然可能出现幻读,需要根据具体场景选择隔离级别

六、实战建议
- 优先使用读已提交隔离级别平衡性能与一致性
- 对账务等强一致性场景使用串行化级别
- 通过
SELECT...FOR UPDATE显式加锁处理特定场景 - 结合数据库的锁监控工具分析死锁问题
如果需要面试鸭会员服务,可以通过面试鸭返利网联系我,可享25元返利优惠。更多面试技巧和真题解析,请访问我们的官网获取资源。


