在数据库事务中,脏读(Dirty Read)指的是:一个事务读取到了另一个尚未提交的事务修改过的数据。
根本原因是:数据库没有对“未提交的数据”做隔离限制,或者说事务的隔离级别设置得比较低(如 READ UNCOMMITTED)。
具体过程和原因如下:
多个事务同时操作同一份数据。例如:
如果数据库使用:
那么事务 B 就可以直接读到事务 A 修改后、但还未提交的数据。
如果之后:
那么:
这就是脏读。
| 时间 | 事务 A | 事务 B |
|---|---|---|
| T1 | 开始事务 | 开始事务 |
| T2 | 将账户余额 100 改为 200(未提交) | |
| T3 | 读取余额为 200(脏读) | |
| T4 | 回滚事务(余额恢复为 100) | |
| T5 | 使用了“200”做业务处理 ❌ |
提高事务隔离级别:
现代数据库(如 MySQL InnoDB)通常默认使用 REPEATABLE READ,并通过 MVCC 避免脏读。
脏读之所以出现,是因为一个事务读到了另一个事务还未提交、且可能回滚的数据,本质是事务隔离不足。
如果你愿意,我也可以帮你对比“脏读 / 不可重复读 / 幻读”的区别。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。