脏读,幻读,不可重复读是什么?
脏读,幻读,不可重复读是什么?
提示
题眼: 他们发生在哪些隔离级别下和解决方法
脏读、幻读和不可重复读是数据库并发控制中的三个问题。
脏读(Dirty Read)指一个事务读取了另一个事务尚未提交的数据。如果后续的事务回滚,那么前面事务读取到的数据就是无效的。
幻读(Phantom Read)指一个事务在两次查询之间,另一个事务插入了新的数据行,导致前一次查询和后一次查询的结果不一致。
不可重复读(Non-repeatable Read)指一个事务多次读取同一数据,在这个过程中,另一个事务对该数据进行了修改或删除,导致前一次读取和后一次读取的结果不一致。
重要
参考答案:
脏读就是读到了另一个事务还没提交的数据。比方说,ID=1的数据原本是1,这个时候另一个人把ID=1的值改成了2,我们读到的也是2,然后操作我们的业务,结果最后提交的时候,发现另一个人没提交自己的事务,ID变成1了,这个就是读到了脏数据。一般情况下啊,脏读发生在读未提交的隔离级别下,只要升级到读提交就可以解决。
不可重复读是说一个事务里多次读取一行数据,拿到的值前后不一致。比如说,我们第一次读的值是1,然后我们自己没有修改过这个数据,再次读的时候发现它变成2了,也就是说我们读到了别的事务提交过的数据。这个发生在读提交的隔离级别下,可重复读会使用MVCC来解决这个问题。
幻读的话比较复杂,它是指读到了别的事务新增的数据,如果是修改或者删除就不算幻读。比如我们原本查id >10 的数据有5条,这个时候有一个事务写入了一条新数据,还提交了事务,我们再查就变成6条了。这样就是幻读。幻读的话需要MVCC加上间隙锁来共同解决。
相关信息
引申:更新和删除数据算不算幻读。
