脏读、不可重复读、幻读

事务是作为单个逻辑工作单元执行的一系列操作,必须满足 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) 解决 解决 解决

Comments