数据库的脏读、不可重复读和幻读

数据库的脏读、不可重复读和幻读

1. 脏读(Dirty Read)

读到了别人 “还没提交” 的数据,别人一回滚,你读的就是垃圾。

场景:

  • 事务 A:把工资改成 20000,但还没提交

  • 事务 B:这时去读,读到 20000

  • 事务 A:发现错了,回滚,工资变回 10000

  • 结果:事务 B 读到了一个根本不存在、被撤销的数据

一句话:读了未提交的内容 = 脏读

2. 不可重复读(Non-repeatable Read)

同一个事务内,两次读同一行数据,结果不一样。

场景:

  • 事务 A:第一次读 → 工资 10000

  • 事务 B:把工资改成 20000 并提交

  • 事务 A:再读一次 → 工资 20000

一句话:同一行数据,前后读不一致 = 不可重复读

3. 幻读(Phantom Read)

同一个事务内,两次查询的 “行数” 不一样,像出现幻觉。

场景:

  • 事务 A:第一次查 “工资> 1 万的人” → 共 10 条

  • 事务 B:插入一条工资 > 1 万的新数据并提交

  • 事务 A:再查一次 → 变成 11 条

一句话:查询结果的行数变多 / 变少 = 幻读

对应隔离级别(解决方案)

  • 读未提交:三种问题都有

  • 读已提交:解决脏读

  • 可重复读(MySQL 默认):解决脏读 + 不可重复读

  • 串行化:全解决,但性能最差

畅快观影(MoonTV) 2026-03-15
修改idea 创建maven-archetype-webapp 项目时,web.xml默认头文件版本号 2026-03-17

评论区