脏读、不可重复读
参考:看一遍就理解:MVCC原理详解,中的内容:
根据上图的内容,实际上,select语句,读取到的数据都是在生成ReadView这一时刻,其他事务中(在之前)已经提交过的数据,以及自己事务修改的数据。因此,经过上面的匹配原则之后,就无法读出未提交的数据,因此就解决了脏读问题。
- 当ReadView不固定的情况下(读已提交),每次快照读都会更新ReadView中的内容。那么就会将ReadView生成时间提前,使得更多的新提交的数据被读取到
- 而在ReadView固定时(可重复读),就是固定了一个时刻,以后再查询,读到的都是此时刻之前提交过的数据。
幻读
案例:
事务1先查询;事务2插入数据并提交;事务1更新该数据,再查询,发现可以查询到该条记录。
在文章末尾举出出现幻读的上述例子中,因为是可重复读的隔离级别,因此ReadView始终都是第一次查询时生成的。但是,由于事务1的更新操作,将该条数据的隐藏列中的tex_id设置为了自己的事务id,因此,根据上面的匹配原则,也就可以查询到了。实际上就是把一个在ReadView生成时刻之后才提交的数据,给改成了当前事务自己修改过的数据,产生了幻读。
但是,如果使用当前读,会额外加临键锁,事务2此时执行插入,则会阻塞。