跳至主要內容

什么叫作脏读、幻读、和不可重复读?

fangzhipeng约 542 字大约 2 分钟

脏读、幻读和不可重复读都是数据库并发控制中的概念,它们描述了在多个事务同时操作数据库时可能出现的问题:

  1. 脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。如果这个事务之后回滚了,那么读取到的数据就是无效的。这种情况下,读取的数据是"脏"的,因为它可能会被后续的操作撤销。

  2. 幻读(Phantom Read):一个事务在两次查询之间,另一个事务插入了新数据,导致第一个事务的两次查询返回的结果集(数据总量)不一致。第一次查询和第二次查询。这种情况下,好像发生了幻觉一样,所以称为"幻读"。

  3. 不可重复读(Non-Repeatable Read):一个事务在读取数据后,另一个事务修改了这些数据,导致第一个事务再次读取同样的数据时,得到的结果不一样。这种情况下,读取的数据"不可重复",因为同样的查询在不同的时间点返回了不同的结果。

MySQL的默认隔离级别是REPEATABLE READ,在这个级别下,这种隔离级别下,所有事务前后多次的读取到的数据内容是不变的。也就是某个事务在执行的过程中,不允许其他事务进行update操作,但允许其他事务进行add操作,造成某个事务前后多次读取到的数据总量不一致的现象,从而产生幻读。

并发事务下发生的问题与解决方式:

隔离级别脏读不可重复读幻读
读未提交可能(出现)可能可能
读已提交不可能(出现)可能可能
可重复读不可能不可能可能
可串行化不可能不可能不可能
方志朋_官方公众号
方志朋_官方公众号