天天看点

一分钟吃透这道题!说说MVCC的内部细节。Java面试题。大家好,我是专注Java干货分享的灰灰。前几天有一个粉丝私信我

作者:灰灰讲Java

一分钟吃透这道题!说说MVCC的内部细节。Java面试题。

大家好,我是专注Java干货分享的灰灰。前几天有一个粉丝私信我说她面试的时候被问到这样子的问题,说说MVCC的内部细节。当时她绞尽了脑汁还是没有答上来,所以希望我能出一期面试题的视频,今天正好有空我就帮她解答一下,大家也可以看看还有没有需要补充。

MVCC是InnoDB存储引擎去解决幻读不可重复读的一种实现方式。Multi-versionconcurrency control的简称,也就是多版本并发控制,多版本来控制事物的并发导致的数据一致性问题。

首先要知道每个非只读事物都会分配一个递增的事务ID。在事务中selelct的时候会生成一个readview的数据结构,里面包含了当前存活的事务ID列表,所谓存活的就是开启了。但是我没有提交的事物,存活的事务ID里面最小的以及下一个即将分配的事务ID。

然后每行数据都需要由事物去变更去操作,所以行数据有一个隐藏的字段叫DB_TRX_ID代表修改数据的最后一个事务ID。然后会在select的时候通过生成的readview跟数据的DBTRX_ID去做比较,看看这行数据是否需要去展示。

假如行数据的DB_TRX_ID小于存活的事务ID里面最小的,说明在查询之前就已经提交了。因为这行的数据的事务ID不存活了,一定是可见的。在select的时候一定是可以查询的。假如行数据的DB_TRX_ID大于等于下一个即将分配的事务ID。

说明你在查询的时候行数据的事务ID根本就还没有开启!在查询的的时候一定是查不到这行数据的。假如行数据的DB_TRX_ID,大于等于存活的数据ID里面最小值,并且小于下一个即将分配的数据ID。那么判断行数据的数据ID是否在存活的列表里面。如果在还没提交!既然没提交,那么在查询的时候不能查询到最新的更改,如果不在那么代表已经提交了能查询到最新的更改。

然后在RC的隔离级别里面,每次selelc的都会去生成一个新的readview,而r隔离级别每次都是用第一次selelct的时候生成的readview,解决了不可重复读跟幻读问题。因为这个数据的比较是跟第一次selelct的readview去比较的,第一次能展示就能展示,第一次不能展示就不能展示。

所以以上就是我对这个问题的全部理解。另外我已经把往期的视频内容跟粉丝遇到的真实面试题整理成了一个程序员面试突击手册,里面有非常详细的文字答案,有需要的小伙伴可以在评论区留言领取。

今天的视频就到这里了,我是灰灰,下期再见。

一分钟吃透这道题!说说MVCC的内部细节。Java面试题。大家好,我是专注Java干货分享的灰灰。前几天有一个粉丝私信我
一分钟吃透这道题!说说MVCC的内部细节。Java面试题。大家好,我是专注Java干货分享的灰灰。前几天有一个粉丝私信我
一分钟吃透这道题!说说MVCC的内部细节。Java面试题。大家好,我是专注Java干货分享的灰灰。前几天有一个粉丝私信我
一分钟吃透这道题!说说MVCC的内部细节。Java面试题。大家好,我是专注Java干货分享的灰灰。前几天有一个粉丝私信我

继续阅读