所以最终返回结果为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组成的
版本链规则看第六节的小结即可
“坚持学习、坚持写作、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。