【脏读、不可重复读、幻读区别】
脏读、不可重复读、幻读是数据库事务中三种并发访问导致的数据一致性问题,其核心区别体现在触发条件、影响范围和具体表现上:
- 脏读(Dirty Read)
触发条件:事务A读取了事务B未提交的修改。
影响范围:仅涉及单个数据项的读取。
表现:事务A看到事务B未提交的中间状态,若事务B回滚,事务A读取的数据将无效(如“看到幻觉”)。 - 不可重复读(Non-Repeatable Read)
触发条件:同一事务内,多次读取同一数据时,其他事务已提交修改。
影响范围:针对同一数据的多次读取。
表现:两次读取结果不同(如第一次读余额100,第二次读90,因期间发生了消费)。 - 幻读(Phantom Read)
触发条件:同一事务内,相同查询条件返回的结果集不同(因其他事务插入/删除数据并提交)。
影响范围:涉及查询结果集的整体变化。
表现:两次查询结果数量不一致(如第一次查找到10条记录,第二次查到11条,因期间插入了新数据)。
对比总结
问题 脏读 不可重复读 幻读
触发条件 读未提交数据 读已提交修改 读新增/删除数据
影响范围 单个数据项 同一数据多次读取 查询结果集
类比场景 看到他人草稿 同一本书价格变化 书架上新增书籍
隔离级别与解决
脏读:通过读已提交(RC)及以上隔离级别避免。
不可重复读:需可重复读(RR)及以上隔离级别。
幻读:通常需串行化(Serializable)隔离级别彻底避免,但部分数据库(如MySQL的RR)通过机制优化也可防止。
理解这些区别有助于根据业务需求选择合理的事务隔离级别,平衡数据一致性与并发性能。