数据库的脏读、不可重复读和幻读分别是什么?

Sherwin.Wei Lv7

数据库的脏读、不可重复读和幻读分别是什么?

回答重点

1)脏读(Dirty Read)

  • 一个事务读取到另一个事务未提交的数据。如果该未提交事务最终被回滚,那么第一个事务读取的数据就是不一致的(脏的)。

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

  • 在同一事务中,读取同一数据两次,但由于其他事务的提交,读取的结果不同。例如,事务 A 读取了一行数据,事务 B 修改并提交了这行数据,导致事务 A 再次读取时得到不同的值。

3)幻读(Phantom Read)

  • 在同一事务中,执行相同的查询操作,返回的结果集由于其他事务的插入而发生变化。例如,事务 A 查询符合某条件的记录,事务 B 插入了新记录并提交,导致事务 A 再次查询时看到不同的记录数量。

扩展知识

几种读与隔离级别的关系

脏读、不可重复读和幻读是不同隔离级别下可能发生的问题:

  • 读未提交允许脏读。
  • 读已提交防止脏读,但可能出现不可重复读。
  • 可重复读防止脏读和不可重复读,但仍可能出现幻读。
  • 串行化防止所有三种问题,但性能开销较大。

注意不可重复读与幻读的区别

幻读是指在事务期间,对于数据总量的突然增加或减少,将别的事务提交的读取到了(针对于数据的数量),不可重复读是指对于同一条数据,在事务执行期间,里面的字段内容发生了变化,读取到了别的事务提交修改的数据。(针对于数据的内容)。

Comments