幻读和不可重复读的区别

139 阅读2分钟

在数据库事务隔离级别中,“幻读”和“不可重复读”是两种不同的现象,它们描述了并发事务间不同类型的干扰。理解这两者的区别对于选择合适的事务隔离级别至关重要。

不可重复读(Non-repeatable Read)

不可重复读指的是在同一事务内,两次执行相同的查询语句可能得到不同的结果,这是因为另一个并发事务在这两次查询之间更新了数据并提交了更改。

  • 例子:假设事务A读取了一行数据,然后事务B修改了这行数据并且提交了这个修改。如果事务A再次读取同一行数据,它会发现数据已经改变了。
  • 影响:这种现象可能导致在一个事务内部的数据视图不一致,即第一次读取的结果与后续读取的结果不一致。

幻读(Phantom Read)

幻读则是指在同一事务内,两次执行同一个查询可能会返回不同的集合,即第一次查询时没有的行,在第二次查询时出现了。这种情况通常发生在另一个并发事务插入了新的行,并且这些新行符合查询条件。

  • 例子:假设事务A根据某个条件查询一组记录,此时事务B插入了一条或多条满足该条件的新记录并提交。当事务A再次执行同样的查询时,它可能会发现有额外的“新”的记录出现,这些记录就像是凭空出现的一样,因此称为“幻读”。
  • 影响:虽然幻读也涉及到数据的变化,但它关注的是查询结果集的变化,而不是单个行的内容变化。

区别总结

image.png