mysql的mvcc多版本控制
最近在看数据库的东西,了解到mysql的mvcc后,开始寻找各种资料,但说的都不是很清楚,看了几天,发现还是不知道是咋回事,今天找到一篇文章,讲的非常透彻,很清楚,拿出来记录在这里
?
Mysql到底是怎么实现MVCC的?这个问题无数人都在问,但google中并无答案,本文尝试从Mysql源码中寻找答案。
? 在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都实现了三个隐藏字段:
?
DB_TRX_ID?)7字节的回滚指针(DB_ROLL_PTR)隐藏的ID6字节的事物ID用来标识该行所述的事务,7字节的回滚指针需要了解下Innodb的事务模型。?
F1~F6是某行列的名字,1~6是其对应的数据。后面三个隐含字段分别对应该行的事务号和回滚指针,假如这条数据是刚INSERT的,可以认为ID为1,其他两个字段为空。
当事务1更改该行的值时,会进行如下操作:用排他锁锁定该行记录redo log把该行修改前的值Copy到undo log,即上图中下面的行修改当前行的值,填写事务编号,使回滚指针指向undo log中的修改前的行
与事务1相同,此时undo log,中有有两行记录,并且通过回滚指针连在一起。因此,如果undo log一直不删除,则会通过当前记录的回滚指针回溯到该行创建时的初始内容,所幸的时在Innodb中存在purge线程,它会查询那些比现在最老的活动事务还早的undo log,并删除它们,从而保证undo log文件不至于无限增长。