深入理解MySQL中的脏读、幻读、不可重复读(附实战复现源码)
在数据库开发中,事务的隔离级别直接影响数据的一致性和并发性能。很多开发者对 脏读(Dirty Read)、不可重复读(Non-Repeatable Read)、幻读(Phantom Read) 这三个概念容易混淆。本文将通过 实际场景复现+原理分析,彻底讲透它们的区别和解决方案。
一、事务隔离级别与问题分类
MySQL默认的隔离级别是 REPEATABLE READ,但不同的隔离级别允许或禁止的问题如下:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | ✅ | ✅ | ✅ |
READ COMMITTED | ❌ | ✅ | ✅ |
REPEATABLE READ(默认) | ❌ | ❌ | ✅* |
SERIALIZABLE | ❌ | ❌ | ❌ |
*注:MySQL的
REPEATABLE READ
通过间隙锁(Gap Lock) 减少了幻读,但未完全消除。
二、实战复现三种问题场景
1. 脏读(Dirty Read)
定义