数据存储:MySQL之MVCC

        MVCC(Mutil-Version Concurrency Control),中文翻译为多版本并发控制。

        MVCC只在repeatable read和read committed两个隔离级别下工作。其他两个隔离级别和MVCC不兼容。因为READ UNCOMMITTED 总是读取最新版本的数据,而不是符合当前事务版本的数据快照。而SERIALIZABLE 则会对所有读取的行都加锁。

        MVCC最大的优势是读取数据不需要对其加锁,读写不冲突,增加了系统并发性能。

                1.Mysql的默认存储引擎InnoDB支持MVCC,这也是我们为什么要了解MVCC的原因。

                2.应对高并发事务,MVCC比单纯的加行锁更有效率,开销更小。

                3.MVCC既可以基于乐观锁来实现,又可以基于悲观锁来实现。

数据存储:MySQL之MVCC_第1张图片

        上面这种可重复读的隔离特性就是基于MVCC实现的。 

        InnoDB中MVCC的实现方式:每行记录有两个隐藏列:DATA_TRX_ID,DATA_ROLL_PTR。

        6个字节的DATA_TRX_ID字段记录执行插入或更新该条记录的最后的事务ID。删除同样会被视为更新,将行记录更新为被删除状态。

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

        如果该行记录没有主键,还需要一个6字节的DB_ROW_ID,随着插入行而递增。

数据存储:MySQL之MVCC_第2张图片

         MVCC是一个虚拟的概念,不存在MVCC的结构,MVCC是依靠隐藏列在undolog中组成版本链。

你可能感兴趣的:(MySQL,mysql,数据库)