温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

脏读和不可重复读的区别

发布时间:2026-10-09 15:02:15 来源:亿速云 阅读:96 作者:小樊 栏目:数据库

在数据库事务隔离级别中,**脏读(Dirty Read)和不可重复读(Non-Repeatable Read)**是两种典型的数据一致性问题,它们的区别主要体现在“读到的数据来源”和“发生场景”上。


1. 脏读(Dirty Read)

定义:
一个事务读取了另一个未提交事务修改的数据。如果后者随后回滚,那么前者读到的数据就是“脏”的、不存在的。

示例:

  • 事务 A 将账户余额从 100 改为 200(尚未提交)
  • 事务 B 读取余额为 200
  • 事务 A 回滚,余额变回 100
  • 事务 B 读到了根本不该存在的 200

关键点:

  • 读的是未提交的数据
  • 问题最严重
  • 出现在 READ UNCOMMITTED 隔离级别

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

定义:
在同一个事务中,多次读取同一数据,结果不一致,因为其他已提交事务修改并更新了该数据。

示例:

  • 事务 A 读取余额为 100
  • 事务 B 提交修改,将余额改为 200
  • 事务 A 再次读取余额为 200
  • 同一事务内两次读结果不同

关键点:

  • 读的是已提交的数据
  • 侧重于“同一事务内重复读不一致”
  • 出现在 READ COMMITTED 及更低级别

3. 核心区别对比

对比项 脏读 不可重复读
数据状态 未提交 已提交
是否允许回滚影响 是(回滚后数据无效) 否(提交已生效)
问题本质 读到“假数据” 同一事务读到“变的数据”
典型隔离级别 READ UNCOMMITTED READ COMMITTED
严重程度 更高 相对较低

4. 一句话总结

  • 脏读:读了别人还没保存的修改
  • 不可重复读:自己读着读着,别人把数据改了并提交

如果你愿意,我也可以用图或结合 MySQL / Oracle 的隔离级别再讲一遍。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手