懵了!女朋友突然问我MVCC实现原理 (5)

所以最终返回结果为niuniu2

小结

在同一个事务中进行查询,会沿用第一次查询语句生成的read-view(前提是隔离级别是在可重复读)

通过以上的四个案例,在版本链寻找过程中,可以总结出一个小技巧

技巧图

技巧图

根据这个小技巧你可以很快的得知此版本是否可见。

如果当前的事务ID在绿色部分,是已经提交事务,则数据可见

如果当前的事务ID在蓝色部分,会有俩种情况,如果当前事务ID在read-view数组内,是没有提交的事务不可见,如果不在数组内数据可见

如果落在红色部分,则不考虑,对于未来的事情不去想即可。

七、总结

阅读本文后,在面试过程中极大可能会遇到的问题就是聊聊你对mvcc的认识。

本文内容从浅到深,从什么是mvcc到mvcc的底层实现,一步一步地陈述了mvcc的实现原理。

本文简单总结

mvcc在不加锁的情况下解决了脏读、不可重复读和快照读下的幻读问题,一定不要认为幻读完全是mvcc解决的

对当前读、快照读理解,简单点说加锁就是当前读,不加锁的就是快照读。

mvcc实现的三大要素俩个隐式字段、回滚日志、read-view

俩个隐式字段:DB_TRX_ID:记录创建这条记录最后一次修改该记录的事务ID,DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本

undo log在更新数据时会产生版本链,是read-view获取数据的前提

read-view当SQL执行查询语句时产生的,是由为提交的事务ID组成的数组和创建的最大事务ID组成的

版本链规则看第六节的小结即可

坚持学习、坚持写作、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfjpw.html