2026-05-26 23:44:51
不可重复读和幻读的核心区别在于数据变更类型及锁控制范围:
不可重复读的核心是数据被修改
当同一事务内多次读取同一数据时,若其他事务在此期间修改了该数据,导致两次读取结果不一致,即构成不可重复读。例如,事务A读取用户余额为100元,事务B随后将其修改为200元,事务A再次读取时发现值已变化。其本质是数据值的动态变更,控制手段为锁定已读取的记录(如通过REPEATABLE READ隔离级别),阻止其他事务修改这些记录,确保事务内数据一致性。
幻读的核心是数据行数变化
当同一事务内多次查询满足同一条件的数据时,若其他事务在此期间新增或删除了符合条件的记录,导致两次查询结果集的行数不同,即构成幻读。例如,事务A查询年龄大于30岁的用户得到5条记录,事务B插入一条年龄31岁的新用户,事务A再次查询时发现结果变为6条。其本质是数据范围的动态扩展或收缩,控制手段需锁定满足条件的记录及其潜在扩展范围(如通过SERIALIZABLE隔离级别),阻止其他事务插入或删除相关记录。
从控制角度的差异
不可重复读仅需锁定已读取的具体记录,避免其被修改;幻读则需锁定满足条件的记录集合及其邻近范围(如通过间隙锁),防止其他事务插入或删除符合条件的记录。例如,在REPEATABLE READ隔离级别下,MySQL通过快照读避免不可重复读,但无法完全阻止幻读;需升级至SERIALIZABLE级别,通过强制串行化执行来消除幻读。
总结:不可重复读关注数据值的稳定性,幻读关注数据范围的完整性;前者通过记录锁控制,后者需更严格的范围锁或串行化机制。