MVCC是一种用空间来换取更高的并发度的技术

对同一个对象不去update,而且记录下每一次的不同版本的值

存在不会消失,新值并不能抹杀原先的存在

所以update操作并不是对世界的真实反映,这是一种便于应用的简化实现

MVCC的历史可以追溯到70年代,数据库的主流技术大部分都停滞在那个年代

MVCC,可以解决2PC的频繁读写冲突;使用MVCC只有写写才会存在冲突,大大降低了冲突的概率

而且MVCC还能进行time-travel

例子,DB中有Begin,End表示该version生效的时间周期,write的时候会产生新的version,同时修改上一个version的end

右图,仍然读的是A0,因为t1的ts=1,在A0的范围中

例子,

T2的R读到的是A0,因为T1还没有commit(取决于隔离程度) ;并且T2执行W的时候会锁等,因为写写发生冲突

当T1 commit后,T2的锁释放,开始写入

这时候的行为取决于隔离程度,如果serializable的,那么T2会失败,因为T2读的是A0,而这时看T2应该读的是A1,所以存在不一致

下面的图表明MVCC被大量的数据库所使用,

MVCC在发生写写冲突时,仍然是需要并发控制协议,主要是之前学习的2PC或OCC

多版本的存储方式,主要有如下的方式,

Append Only,比较直接的方式,HBase,PG都是采用这种方式

为了快速找到同一个对象的多个版本,可以用链表来组织,那么旧的放前面,还是新的放见面,完全是看场景

新的放前面比较直觉,因为一般都是需要读最新的数据,但是这样每次新增都需要更新head指针

Time travel就是把最新的table和历史table分离

Delta只记录差值

垃圾回收,纯粹是工程实践,

定期过期活跃thread已经不用时间段的数据,这里有个设计是,加上Bitmap来表示这个page是否有更新,这样Vacumm不用去检查每个page,没更新的就不用检查

Worker thread在遍历的时候,随便找到过期的

如果用MVCC,那么index就需要指向chain head

可以看到对于secondary index,如果有很多,每次head变化都要更新很多,非常低效

所以有两种方式,

思路都是,通过逻辑id,间接的指向Physical address,这样只需要改一个地方

这里列出所有数据库在MVCC上的实现方式

CMU Database Systems - MVCC的更多相关文章

  1. CMU Database Systems - Concurrency Control Theory

    并发控制是数据库理论里面最难的课题之一 并发控制首先了解一下事务,transaction 定义如下, 其实transaction关键是,要满足ACID属性, 左边的正式的定义,由于的intuitive ...

  2. CMU Database Systems - Database Recovery

    数据库数据丢失的典型场景如下, 数据commit后,还没有来得及flush到disk,这时候crash就会丢失数据 当然这只是fail的一种情况,DataBase Recovery要讨论的是,在各种f ...

  3. CMU Database Systems - Timestamp Ordering Concurrency Control

    2PL是悲观锁,Pessimistic,这章讲乐观锁,Optimistic,单机的,非分布式的 Timestamp Ordering,以时间为序,这个是非常自然的想法,按每个transaction的时 ...

  4. CMU Database Systems - Storage and BufferPool

    Database Storage 存储分为volatile和non-volatile,越快的越贵越小 那么所以要解决的第一个问题就是,如果尽量在有限的成本下,让读写更快些 意思就是,尽量读写volat ...

  5. CMU Database Systems - Two-phase Locking

    首先锁是用来做互斥的,解决并发执行时的数据不一致问题 如图会导致,不可重复读 如果这里用lock就可以解决,数据库里面有个LockManager来作为master,负责锁的记录和授权 数据库里面的基本 ...

  6. CMU Database Systems - Distributed OLTP & OLAP

    OLTP scale-up和scale-out scale-up会有上限,无法不断up,而且相对而言,up升级会比较麻烦,所以大数据,云计算需要scale-out scale-out,就是分布式数据库 ...

  7. CMU Database Systems - Embedded Database Logic

    正常应用和数据库交互的过程是这样的, 其实我们也可以把部分应用逻辑放到DB端去执行,来提升效率 User-defined Function Stored Procedures Triggers Cha ...

  8. CMU Database Systems - Parallel Execution

    并发执行,主要为了增大吞吐,降低延迟,提高数据库的可用性 先区分一组概念,parallel和distributed的区别 总的来说,parallel是指在物理上很近的节点,比如本机的多个线程或进程,不 ...

  9. CMU Database Systems - Query Optimization

    查询优化应该是数据库领域最难的topic 当前查询优化,主要有两种思路, Rules-based,基于先验知识,用if-else把优化逻辑写死 Cost-based,试图去评估各个查询计划的cost, ...

随机推荐

  1. centos7 docker安装Jenkins BlueOcean

    Jenkins是一款Java开发的跨平台持续集成和持续发布的开源项目,Jenkins已经作为各大公司进行CI/CD的首选工具.而BlueOcean是Jenkins推出的一个插件,其目的就是让程序员执行 ...

  2. python(读取excel操作-xlrd模块)

    一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境. 或者在cmd窗口  pip install  ...

  3. 什么影响了mysql的性能-存储引擎层

    5.6版本以前默认是MyISam存储引擎,5.6版本之后默认支持的Innodb存储引擎,这两种也是最常用的. 存储引擎层 MyISAM 5.5之前版本默认存储引擎 存储引擎表由MYD和MYI组成 特性 ...

  4. Pthon魔术方法(Magic Methods)-实例化

    Pthon魔术方法(Magic Methods)-实例化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.实例化一个对象 __new__: 该方法需要返回一个值,如果该值不是cl ...

  5. SQL进阶系列之4HAVING字句的力量

    写在前面 SQL是面向集合的语言,与面向过程和面向对象语言都不一样 寻找缺失的编号 /* 寻找缺失的编号 */ CREATE TABLE SeqTbl (seq INTEGER PRIMARY KEY ...

  6. django考点答案

    1 列举Http请求中常见的请求方式 2 谈谈你对HTTP协议的认识.1.1 长连接3 简述MVC模式和MVT模式4 简述Django请求生命周期5 简述什么是FBV和CBV6 谈一谈你对ORM的理解 ...

  7. python学习之多窗口切换

    多窗口切换: from selenium import webdriver d = webdriver.Firefox() d.window_handles #显示所有的窗口 d.current_wi ...

  8. Zabbix4.0国内下载源

    国内zabbix源总结 目前发现的有以下几个站点: 1.阿里巴巴开源镜像站(推荐使用) 地址:https://mirrors.aliyun.com/zabbix/ 2.华为开源镜像站(推荐使用) 地址 ...

  9. vue 选择之单选,多选,反选,全选,反选

    1.单选 当我们用v-for渲染一组数据的时候,我们可以带上index以便区分他们我们这里利用这个index来简单地实现单选. <li v-for="(item,index) in r ...

  10. WebPack探索之路(1)

    1. 卸载全局的webpack npm ininstall webpack webpack-cli -g 其中安装webpack-cli 是可以让webpack在命令行中执行.在webpack4.0中 ...