CMU Database Systems - MVCC
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的更多相关文章
- CMU Database Systems - Concurrency Control Theory
并发控制是数据库理论里面最难的课题之一 并发控制首先了解一下事务,transaction 定义如下, 其实transaction关键是,要满足ACID属性, 左边的正式的定义,由于的intuitive ...
- CMU Database Systems - Database Recovery
数据库数据丢失的典型场景如下, 数据commit后,还没有来得及flush到disk,这时候crash就会丢失数据 当然这只是fail的一种情况,DataBase Recovery要讨论的是,在各种f ...
- CMU Database Systems - Timestamp Ordering Concurrency Control
2PL是悲观锁,Pessimistic,这章讲乐观锁,Optimistic,单机的,非分布式的 Timestamp Ordering,以时间为序,这个是非常自然的想法,按每个transaction的时 ...
- CMU Database Systems - Storage and BufferPool
Database Storage 存储分为volatile和non-volatile,越快的越贵越小 那么所以要解决的第一个问题就是,如果尽量在有限的成本下,让读写更快些 意思就是,尽量读写volat ...
- CMU Database Systems - Two-phase Locking
首先锁是用来做互斥的,解决并发执行时的数据不一致问题 如图会导致,不可重复读 如果这里用lock就可以解决,数据库里面有个LockManager来作为master,负责锁的记录和授权 数据库里面的基本 ...
- CMU Database Systems - Distributed OLTP & OLAP
OLTP scale-up和scale-out scale-up会有上限,无法不断up,而且相对而言,up升级会比较麻烦,所以大数据,云计算需要scale-out scale-out,就是分布式数据库 ...
- CMU Database Systems - Embedded Database Logic
正常应用和数据库交互的过程是这样的, 其实我们也可以把部分应用逻辑放到DB端去执行,来提升效率 User-defined Function Stored Procedures Triggers Cha ...
- CMU Database Systems - Parallel Execution
并发执行,主要为了增大吞吐,降低延迟,提高数据库的可用性 先区分一组概念,parallel和distributed的区别 总的来说,parallel是指在物理上很近的节点,比如本机的多个线程或进程,不 ...
- CMU Database Systems - Query Optimization
查询优化应该是数据库领域最难的topic 当前查询优化,主要有两种思路, Rules-based,基于先验知识,用if-else把优化逻辑写死 Cost-based,试图去评估各个查询计划的cost, ...
随机推荐
- 知识扩展——(转)一篇文章彻底弄懂Base64编码原理
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成 ...
- sphinx中文版Coreseek中文检索引擎安装和使用方法(Linux)
sphinx中文版Coreseek中文检索引擎安装和使用方法(Linux) 众所周知,在MYSQL数据库中,如果你在百万级别数据库中使用 like 的话那你一定在那骂娘,coreseek是一个 ...
- 剑指Offer(二十):包含min函数的栈
剑指Offer(二十):包含min函数的栈 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ba ...
- 树莓派上 Docker 的安装和使用
Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不 ...
- Appache Flume 中文介绍(转)
Flume 是什么 Apache Flume是一个高可靠.高可用的分布式的海量日志收集.聚合.传输系统.它可以从不同的日志源采集数据并集中存储. Flume也算是Hadoop生态系统的一 ...
- axios基本设置
- 使用selenium三种方式打开文件:
#路径读取方式一:# b.get(r"C:\我的代码\selenium自动化测试\test.html")#路径读取方式二:# b.get("C:\\我的代码\\selen ...
- 输入一个正整数n,生成一张2的乘方表,输出2*0—2*n的值。
#include<stdio.h>#include<math.h> //程序中调用幂函数pow(),需包含头文件math.h//void main(){ int i,n; pr ...
- SpringSecurity 整合 JWT
项目集成Spring Security(一) 在上一篇基础上继续集成 JWT ,实现用户身份验证. 前言 前后端分离项目中,如果直接把 API 接口对外开放,我们知道这样风险是很大的,所以在上一篇中我 ...
- Statistical Methods for Machine Learning
机器学习中的统计学方法. 从机器学习的核心视角来看,优化(optimization)和统计(statistics)是其最最重要的两项支撑技术.统计的方法可以用来机器学习,比如:聚类.贝叶斯等等,当然机 ...