0
点赞
收藏
分享

微信扫一扫

MySQL中幻读与不可重复读的区别

醉东枫 2024-10-12 阅读 13

1. 幻读(Phantom Read)

  • 定义:幻读是指在同一个事务中,两次相同条件的查询结果出现了不同的数据集。这通常发生在一个事务(T1)在读取某个范围的数据后,另一个事务(T2)插入了新的数据,并提交了该事务,导致 T1 再次查询同样的条件时,结果中出现了新插入的数据。

  • 示例

    • 事务 T1 查询 SELECT * FROM Users WHERE age > 30,结果返回了 5 条记录。
    • 事务 T2 插入了一条 age = 35 的记录并提交。
    • 事务 T1 再次执行相同的查询,此时结果返回了 6 条记录,其中包括了刚刚插入的记录。

2. 不可重复读(Non-repeatable Read)

  • 定义:不可重复读是指在同一个事务中,两次相同的查询结果出现了不同的数据值。这通常发生在一个事务(T1)读取了一条记录后,另一个事务(T2)修改了该记录并提交了该事务,导致 T1 再次查询同一条记录时,看到的值发生了变化。

  • 示例

    • 事务 T1 查询 SELECT salary FROM Employees WHERE id = 1,返回了 $1000。
    • 事务 T2 更新了员工的薪水,将其从 $1000 修改为 $1200,并提交。
    • 事务 T1 再次执行相同的查询,此时返回的薪水变为 $1200。

幻读与不可重复读的区别

特性幻读不可重复读
发生场景在同一事务中,两次相同条件查询时,新增数据导致查询结果集不同。在同一事务中,读取到的数据被其他事务修改,导致读取到的值不同。
影响范围查询结果的记录数量不同(多了或少了记录)。查询结果的某条记录的值不同。
示例查询的结果集不同,可能多出新插入的记录。查询的结果中同一记录的值不同。

总结

  • 幻读 主要关注于同一条件查询时新增的记录,导致结果集发生变化。
  • 不可重复读 主要关注于同一记录的值在不同读取中发生变化。

这两个现象都是在事务处理过程中需要考虑的重要问题,尤其是在需要保持数据一致性的应用场景中。通常,选择合适的事务隔离级别(如可重复读、Serializable 等)可以有效避免这些问题。

举报

相关推荐

0 条评论