温馨提示×

温馨提示×

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

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

事务中为何会出现脏读

发布时间:2026-10-09 14:24:13 来源:亿速云 阅读:102 作者:小樊 栏目:数据库

在数据库事务中,脏读(Dirty Read)指的是:一个事务读取到了另一个尚未提交的事务修改过的数据。

为什么会出现脏读?

根本原因是:数据库没有对“未提交的数据”做隔离限制,或者说事务的隔离级别设置得比较低(如 READ UNCOMMITTED)。

具体过程和原因如下:

1. 事务并发执行

多个事务同时操作同一份数据。例如:

  • 事务 A 修改了某行数据,但还没提交
  • 事务 B 去读取这行数据

2. 数据库允许读取“未提交版本”

如果数据库使用:

  • READ UNCOMMITTED(读未提交) 隔离级别
    或者
  • 某些实现中未加读锁 / 未使用多版本控制(MVCC)

那么事务 B 就可以直接读到事务 A 修改后、但还未提交的数据。

3. 被读的数据可能回滚

如果之后:

  • 事务 A 因为错误、异常或业务校验失败而 ROLLBACK(回滚)

那么:

  • 事务 B 之前读到的数据在逻辑上根本不存在过
  • 但事务 B 已经基于这个“假数据”做了判断或后续操作

这就是脏读。


举个简单例子

时间 事务 A 事务 B
T1 开始事务 开始事务
T2 将账户余额 100 改为 200(未提交)
T3 读取余额为 200(脏读)
T4 回滚事务(余额恢复为 100)
T5 使用了“200”做业务处理 ❌

如何避免脏读?

提高事务隔离级别:

  • READ COMMITTED(读已提交):只能读已提交的数据 ✅
  • REPEATABLE READ(可重复读)
  • SERIALIZABLE(串行化)

现代数据库(如 MySQL InnoDB)通常默认使用 REPEATABLE READ,并通过 MVCC 避免脏读。


一句话总结

脏读之所以出现,是因为一个事务读到了另一个事务还未提交、且可能回滚的数据,本质是事务隔离不足。

如果你愿意,我也可以帮你对比“脏读 / 不可重复读 / 幻读”的区别。

向AI问一下细节

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

AI
助
手