脏读、幻读、不可重复读的区别是什么

脏读、幻读、不可重复读的区别是什么
最新回答
"焉薰妝╪

2026-05-20 18:22:05

脏读、不可重复读、幻读是数据库事务并发执行时因隔离级别不足导致的三种异常现象,核心区别在于数据状态变化类型和影响范围:

脏读
指一个事务读取了另一个未提交事务修改的数据。例如,事务A修改某行数据但未提交,事务B读取该数据后,事务A回滚导致B读取到无效数据。关键点在于数据未提交即被读取,破坏了事务的原子性。此现象仅发生在未提交读(READ_UNCOMMITTED)隔离级别下,其他级别通过锁定机制避免。

不可重复读
指同一事务内多次读取同一数据,因其他事务修改导致结果不一致。例如,事务A首次读取某行数据后,事务B修改并提交该数据,事务A再次读取时发现值变化。核心是数据被修改,影响范围为单行数据。此现象出现在已提交读(READ_COMMITTED)及以上隔离级别,但可重复读(REPEATABLE_READ)通过锁定已读行避免。

幻读
指同一事务内多次查询满足条件的记录集,因其他事务插入或删除导致结果集数量变化。例如,事务A查询年龄为30的用户后,事务B插入新用户并提交,事务A再次查询时发现多出记录。关键在于新增或删除导致记录数变化,影响范围为整个结果集。此现象在可重复读(REPEABLE_READ)隔离级别下仍可能发生,需串行化(SERIALIZABLE)级别通过锁表彻底避免。

三者核心差异:

  1. 数据状态变化类型:脏读涉及未提交数据,不可重复读涉及已提交修改,幻读涉及新增/删除。
  2. 影响范围:脏读和不可重复读针对单行数据,幻读针对查询结果集。
  3. 隔离级别关联:脏读仅在最低隔离级别出现;不可重复读在已提交读及以上级别仍可能发生;幻读需最高隔离级别才能完全避免。

实际应用中,需根据业务对数据一致性的要求选择隔离级别,平衡并发性能与数据准确性。