
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库架构开发技术的学习与应用是每一位软件编程开发程序员都应该熟练掌握的一个编程技术,下面我们就通过案例分析来了解一下,数据库MVCC的用法分析。
MVCC如何解决脏读、不可重复读和虚读
先回顾一下MySQL的事务隔离级别中的视图
读未提交(RU):它是直接返回记录的新值,没有视图
读已提交(RC):每次查询都会创建一个ReadView
可重复读(RR):这个ReadView是在事务启动时创建,整个事务存在期间都用这个ReadView
串行化(serializable):直接用加锁的方式来避免并行访问
1.MVCC解决脏读
在读已提交的MVCC中,每次查询都会创建一个ReadView。由于版本控制的可见性规则,使得当前事务只看的到已经提交的数据,所以这样就避免了看见未提交的数据,从而解决了脏读。
2.MVCC解决不可重复读
因为RC级别每次查询都会创建一个ReadView,所以对于已提交的事务,由于不能共用一个ReadView,还是会造成两次读取过程中的不可重复读。所以RR级别通过使用从启动到结束使用一个ReadView,来解决提交两次查询读取不一致的现象。
3.MVCC到底能不能解决虚读?
先说结论:MVCC可以解决“快照读”,无法解决“当前读”
MVCC可以解决“快照读”
MVCC可以解决如不加锁的select。原理就是MVCC使用快照来控制版本数据读取的范围,从而在RR级别避免了虚读。在我上面讲虚读的举例就说明了,在select快照读时,没有发现新的数据。但是新插入同样的数据却报错,说明MVCC无法彻底解决虚读。
MVCC无法解决“当前读”
如果在select上加锁,使用“当前读”,虚读还是会出现。所以真正要解决虚读,还是得用加锁的形式来解决。所以一般而言,也只有串行化级别才能真正解决虚读。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。