00:00
My in the dbmv CC实现原理。首先,MVCC是什么?全称multiple version currency controller,即多版本并发控制。使用它的目的是可以通过记录多个修改的历史版本来替代锁,实现事物间隔离效果。保证非阻塞毒。那么前提我们要理解事物的隔离级别。比如说有个电影院,电影院里面的电视节目我们可以看作某一行数据,那么遥控器可以修改节目,所以我们可以看作是读写操作,那么具体看电视的人,我们可以看作成一个事物,电影院工作人员呢,可以看成一把锁。当有多个人来看电影,电影院工作人员每次只让一个人进入,那么这种行为我们称之为串行化。可想而知,串行化是无法达到利益的最大化的,所以电影院必须让每一个人都可以进入。
01:02
那么如果工作人员不加操作,那么大家有可能聚在一起只是观看,那就是独独操作,对本身的电视节目不会产生影响,那有可能大家都想看自己的节目,频繁的那个换台,就是写写操作,那么我们只能以最后一个人。换台的那个电视节目为准,那么有可能大家有的人想观看,有的人想换台,就是读写操作,那么这种情况呢,就会产生比较混乱的效果,你可能永远看不到你想要的那个电视节目,所以在我们的数据库当中就会映射成如下的几个问题,就是脏读、换读,不可重复读。那么为了解决这些读写操作上的问题,数据库就引入了隔离级别。我们以不可重复度来举例,还是刚才的例子,比如说有多个人看电影,其中有一个人出去了一下才回来,发现电视节目已经被换掉了,那么这个时候他是不可容忍的,他找到电影院的工作人员说,我们要杜绝这种情况。
02:12
那么,电影院工作人员就想了个办法。就只能让一个人拿到遥控器,其他人都只能等待那个人看完之后才能换台。那么这种情况也可以解决,不可重复读,但依旧会阻塞,性能不是最好。所以说我们引入了MVCC,他的思想就是电影院工作人员不操作,但是我们给每一个看电影的人都录制一份电视节目,当这个人要看的时候,也就是他可以直接看这个录影机内的内容,那么其他人对于电视节目的修改。对他不会产生影响,使用这样的方式可以隔离读写操作,但是MVCC的实现不止这么简单。这我们看一下实现核心一表的隐藏列,隐藏列中记录了事物的ID和上个版本数据地址。
03:04
2UNDO log记录数据各版本修改历史,也就是15列。3READ view,也就是读视图,主要用于判断哪些版本对当前事物可见举例说明。比如说事物A插入了一行数据。这是事物B对数据进行修改,那么就形成版本链,B指向A的地址,那事物C对事物B进行修改,那么也同样,版本链会延续事物C指向事物B的体质。那事物D修改同理,指向事物C的那个地址,那ABC的修改会放到undo log里面,事物D就是最新的修改。Red w。Red的组成是由未提交的事务ID数组。和其数组中的最小值以及最大值组成。那么对于当前的事物来说,我们只要判断哪些对我可见。
04:07
也就是不在未提交的事务数组中,并且事务ID小于max,或者是自己对当前事物,它都是可见的。那么根据这一个特性,我们可以继续看上一个例子,事务ID为100的已经提交,那么read view如下所示。假设当前有一个是我ID为一百二的,想去查询name。那么第一次查询,根据我们可以判断只有100对它可见。那么这是108,已经提交再次查询,我们要判断是否重新拿red,如果不拿,也就是100可见,如果重新拿,那么108也可见,这就相当于可重复的和读以提交两种效果。
我来说两句