数据库的脏读、不可重复读和幻读分别是什么?

发布时间:2026/8/24 13:20:52
数据库的脏读、不可重复读和幻读分别是什么? 数据库的脏读、不可重复读和幻读分别是什么都是多事务并发下产生的数据一致性问题下面用通俗例子区分事务A、事务B并发执行。1. 脏读读到了别的事务未提交的修改数据如果对方回滚读到的数据就是无效“脏数据”。事务B修改一条数据没有commit提交事务A读到B还未提交的修改结果如果B执行rollback回滚数据恢复原样A读到的数据就是虚假无效的数据这就是脏读。示例B把用户余额改成0没提交A查询看到余额0B回滚余额变回100。A刚才读到的0就是脏数据。✅ RC读已提交及以上隔离级别就解决脏读。2. 不可重复读同一个事务内先后两次读取同一条数据中间被其他事务提交修改两次结果不一样。重点同一条记录内容被修改更新。事务A第一次查询id1用户余额100事务B更新这条记录并commit提交余额改成200事务A还没结束再次查询同一条id1余额变成200同一个事务前后两次读同一条结果不一样就是不可重复读。✅ RR可重复读解决不可重复读。核心侧重数据被update修改。3. 幻读同一个事务中前后执行相同的范围查询其他事务做insert/delete提交导致返回的行数发生变化像出现幻觉一样。重点是行数变化。事务A查询select * from user where id100查出2条记录事务B插入一条id50的新数据执行commit事务A还没结束再次执行一模一样的查询返回3条A明明没有新增数据凭空多出来一行这就是幻读。SQL标准中RR会存在幻读MySQL InnoDB的RR级别通过MVCC 临键锁解决幻读。核心侧重插入、删除行数变化。三者简明对比现象核心问题触发操作脏读读到未提交的数据别的事务update未commit不可重复读同一事务同一条记录前后读结果不同别的事务update后commit幻读同一事务范围查询行数变多/变少别的事务insert / delete后commit补充关键点面试容易混淆不可重复读针对已有记录内容更新幻读针对新增或者删除记录行数变化。脏读读到别人没提交的数据不可重复读、幻读读到的都是别人已经提交的数据。总结脏读读到未提交的脏数据不可重复读同一事务两次读同一条内容被别人修改提交结果不一样幻读同一事务范围查询别人插入删除提交查询行数发生变化。