MVCC只在READ COMMITED和REPEATABLE READ两个隔离级别下工作。
现在通过具体的例子说明MVCC的原理
假设F1-F6是表中字段的名字,1-6是其对应的数据。后面三个隐含字段分别对应该行的隐含ID(DB_ROW_ID)、事务号(DB_TRX_ID,最新更新这条记录的事务ID)和回滚指针(DB_ROLL_PT,指向当前记录项的回滚的undo log记录 )
第一步
假设这条数据是刚INSERT的,可以认为ID为1,其他两个字段为空。
第二步
当事务1更改该行的时候,会进行如下操作:用排它锁锁定该行;记录redo log;把该行修改前的值copy到undo log,即图中下面的行;修改当前行的值,填写事务编号,使回滚指针指向undo log中的修改前的行;
第三步
与事务1相同,此时undo log中有两条记录,并通过回滚指针连在一起。因此如果undo log如果一直不删除,则会通过当前记录的回滚指针回溯到该行创建时的初始内容,所幸的是InnoDB中有purge线程,它会查询并删除比现在最老的活动事务还早的undo log,从而保证undo log文件不至于无限增长。