脏读、不可重复读、幻读
事务是作为单个逻辑工作单元执行的一系列操作,必须满足 ACID 特性:原子性、一致性、隔离性和持久性。
在解释脏读、不可重复读、幻读这三种现象之前,需要先说明一下 事务(Transaction) 的基本特性 ACID:
-
Atomicity(原子性)
-
Consistency(一致性)
-
Isolation(隔离性)
-
Durability(持久性)
这三种现象就是为了解决 隔离性 而存在的。因为多个事务并发执行,破坏了事务的隔离性。
-
脏读 (Dirty Read):
一个事务 T_1 读取了另一个尚未提交(Uncommitted) 的事务 T_2 写入的数据。如果 T_2 最终执行了 回滚(Rollback),那么 T_1 读取到的数据就是无效的、脏的数据。 -
不可重复读 (Non-Repeatable Read):
一个事务 T_1 在两次相同的查询(针对同一行数据)中,得到了不同的结果。这是因为在 T_1 两次查询之间,另一个事务 T_2 修改并提交了这行数据。 -
幻读 (Phantom Read):
一个事务 T_1 在两次相同的查询(针对一个数据集合)中,得到了不同的行数。这是因为在 T_1 两次查询之间,另一个事务 T_2 插入或删除了符合 T_1 查询条件的records。
| 事务隔离级别 | 脏读 (Dirty Read) | 不可重复读 (Non-Repeatable Read) | 幻读 (Phantom Read) |
|---|---|---|---|
| 读未提交 (Read Uncommitted) | 会发生 | 会发生 | 会发生 |
| 读提交 (Read Committed) | 解决 | 会发生 | 会发生 |
| 可重复读 (Repeatable Read) | 解决 | 解决 | MySQL 解决 / 标准 SQL 仍会发生 |
| 串行化 (Serializable) | 解决 | 解决 | 解决 |