在数据库事务的 ACID 特性中,隔离性(Isolation) 用来保证多个并发事务之间互不干扰。
脏读(Dirty Read) 指的是:一个事务读到了另一个事务尚未提交的修改数据,如果后者回滚,读到的就是“脏”的、不存在的数据。
下面从隔离级别和实现机制两个角度说明隔离性如何避免脏读。
SQL 标准定义了四种隔离级别,脏读是否被允许如下:
| 隔离级别 | 是否允许脏读 |
|---|---|
| 读未提交(Read Uncommitted) | ✅ 允许 |
| 读已提交(Read Committed) | ❌ 禁止 |
| 可重复读(Repeatable Read) | ❌ 禁止 |
| 串行化(Serializable) | ❌ 禁止 |
只要将隔离级别设置为 读已提交及以上,数据库就不会让一个事务读到其他事务未提交的修改,从而避免了脏读。
示例(MySQL):
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
示意:
事务A: update user set age=20 (未提交)
事务B: select age from user
→ 读到的是事务A修改前的已提交值
隔离性避免脏读的本质是:
不允许一个事务看到另一个事务“还未确定生效”的修改。
实现方式包括:
如果你愿意,我也可以用 例子 + 时间线 或结合 MySQL / Oracle 具体说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。