什么叫作脏读、幻读、和不可重复读?
约 542 字大约 2 分钟
脏读、幻读和不可重复读都是数据库并发控制中的概念,它们描述了在多个事务同时操作数据库时可能出现的问题:
脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。如果这个事务之后回滚了,那么读取到的数据就是无效的。这种情况下,读取的数据是"脏"的,因为它可能会被后续的操作撤销。
幻读(Phantom Read):一个事务在两次查询之间,另一个事务插入了新数据,导致第一个事务的两次查询返回的结果集(数据总量)不一致。第一次查询和第二次查询。这种情况下,好像发生了幻觉一样,所以称为"幻读"。
不可重复读(Non-Repeatable Read):一个事务在读取数据后,另一个事务修改了这些数据,导致第一个事务再次读取同样的数据时,得到的结果不一样。这种情况下,读取的数据"不可重复",因为同样的查询在不同的时间点返回了不同的结果。
MySQL的默认隔离级别是REPEATABLE READ
,在这个级别下,这种隔离级别下,所有事务前后多次的读取到的数据内容是不变的。也就是某个事务在执行的过程中,不允许其他事务进行update操作,但允许其他事务进行add操作,造成某个事务前后多次读取到的数据总量不一致的现象,从而产生幻读。
并发事务下发生的问题与解决方式:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 可能(出现) | 可能 | 可能 |
读已提交 | 不可能(出现) | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
可串行化 | 不可能 | 不可能 | 不可能 |