深入揭秘:MySQL中MVCC的神奇原理

要解决读一致性的问题,保证一个事务中前后两次读取数据结果一致,还有一种 MVCC 的方式,又叫多版本的并发控制(Multi Version Concurrency Control)。


MVCC 就是为了让一个事务前后两次读取到的数据保持一致,在修改数据的时候给它建立一个快照,后面的查询操作读取这个快照就可以了。MVCC 解决了加上排他锁后的行记录,可以被查询到的问题,从而解决了由于写操作阻塞而引发读操作并发的问题。

InnoDB 为每一行记录都默认生成两个隐藏列:DATA_TRX_ID 、 DATA_ROLL_PTR 。

DATA_TRX_ID,记录最新插入或者更新这条行记录的事务 ID ,大小为 6 个字节,事务编号是自动递增的(我们把它理解为创建版本号,在数据新增或者修改为新数据的时候,记录当前事务 ID)。

DATA_ROLL_PTR,表示指向该行回滚段 (rollback segment) 的指针,大小为 7 个字节,InnoDB 便是通过这个指针找到之前版本的数据,我们把它理解为回滚版本号。该行记录的所有旧版本,在 undo 中都通过链表的形式组织。

1

MVCC 的原理讲解

深入揭秘:MySQL中MVCC的神奇原理-1

第一个事务:

    begin; 
    insert into person values(1,'张三'); 
    insert into person values(2,'李四'); 
    commit;