zoukankan      html  css  js  c++  java
  • 关于MVCC

    1多版本控制,所谓的多版本,指的是undo中存储着数据行修改前的多个版本,这些版本通过指针依次串联起来,我们可以提供指针依次往前找,一直找到满足我们需要的版本,这中间可能涉及到多个版本,因此称为MVCCMVCC实现的基础就是UNDO中会存储数据行修改前的值,这个值包括数据以及事务IDrollPointer

    2MVCC使得在一个事务中,所有的select访问到的是同一个时刻的数据,反复执行一个select,得到的数据是一致的

    3、通过undo来实现

    4、实现了select的可重复读隔离级别

    5、可重复读隔离级别通过MVCC来实现select,通过gap lock来实现dml

    6mvcc会因为长事务、大事务导致undo暴涨。undo在低版本中,没有办法自动回收,在新的版本中,undo的自动回收机制风险很大,因此也要谨慎使用。要避免长事务,通过监控innodb_trx视图,里面有两个列,一个是事务的开始时间,一个是事务的修改行数,判断是长事务还是大事务,对于长事务,要及时进行回滚或者提交。

    7、每一个数据行有一个事务ID的伪列和rollpointer的伪列,事务id是一个数字,也是事务的唯一标识,数字越大说明事务发生的时间越晚,数字越小,说明事务发生的时间越早

    8、当我们在一个事务中读取一个数据行的时候,我们要求读取的数据行中的事务id必须<=当前事务的id,如果数据行上面的事务id>当前事务id,我们需要根据rollpointer指针在undo中读取历史版本数据,如果当前事务ID100,数据行的当前版本为110,第一个历史版本是105,我需要继续追溯,如果第二个历史版本是98,那么我们就需要读取历史版本98对应的数据行信息,这个就是多版本的含义,这个也实现了可重复读

    9、多版本实现的核心依靠的就是undo,具体实现原理就是数据行的rollpoilter伪列,这个伪列可以指向老的数据行版本,在老的数据行版本中也有rollpointer伪列,指向更老的数据行版本,一次类推,如果undo足够大,这个数据行理论上可以存在过去的所有版本,形成一个链条结构

    10purge线程在清空undodelete数据的时候,假设当前活跃事务的最小id100purger只清除事务id<100对应的delete行或者undo数据,至少保留数据行事务id<100的一个版本,对于对于>=100delete行或者undo数据,purge会保留对应的信息

    11、因此长事务会导致undo暴增或者undo持续增加就不难理解,因为长事务说明这个事务存在时间很久,事务id相对较小,purge线程在清空delete行或者undo数据的时候,能够清除的数据就变得很少,因为很多数据事务id>长事务对应的id,事务不断产生,undo不断被使用,因此undo空间持续增加

  • 相关阅读:
    列举面向对象中的特殊成员以及应用场景
    python中os和sys模块
    谈谈你对闭包的理解?
    Python面试题(练习一)
    logging模块的作用以及应用场景
    Python的垃圾回收机制
    Python的深浅copy
    rust 支持的CPU架构
    Rust 数据类型
    网站用https访问的问题
  • 原文地址:https://www.cnblogs.com/5945yang/p/11259159.html
Copyright © 2011-2022 走看看