图说论文《An Empirical Evaluation of In-Memory Multi-Version Concurrency Control》
本文从《 An Empirical Evaluation of In-Memory Multi-Version Concurrency Control》摘取部分图片,来介绍 MVCC。 该文从并发控制协议,版本存储模型,垃圾回收机制,索引机制四个方面阐述了 MVCC 的现状。
更多详细内容,请查看原文。
元数据

DBMS 一般会为每个数据版本维护一个用以协调并发事务的 Tuple 数据。 Tuple 版本的 Header 一般会包含以下四个元数据字段:
- txn-id: 该字段一般作为该版本 Tuple 版本的写锁。若 txn-id 字段为 Tid, 则表示 ID 为 Tid 的事务,获取了该 Tuple 版本的写锁;当写事务处理完成后, 该字段会被置为 0。
- begin-ts 和 end-ts:标识当前该 Tuple 版本的生命周期起止时间。当改 Tuple 版本被删除时, 它的 begin-ts 会被置为 INF。
- pointer:前置/后续邻居版本的地址。
并发控制协议
并发控制协议负责协调并发事务的执行。它确定是否允许某个事务访问或变更指定的 Tuple 版本,是否允许提交某个事务的变更。

MVTO(Timestamp Order)
- read-ts:Tuple 版本中新增 read-ts 字段作为读锁。当有事务发起读取操作时,会更新该字段为
m
a
x
(
T
i
d
max(T_{id}
max(Tid, read-ts)。仅在
T
i
d
T_{id}
Tid 大于 read-ts 时,事务才能对该 Tuple 版本发起变更操作。
- READ: 当事务 T 发起对 Tuple A 的 READ 请求,DBMS 会查找
[begin-ts, end-ts]区间包含 Tid 的物理 Tuple 版本执行 READ 操作。如 Fig 2(a) 中, 事务 T 的 READ A 能操作 Ax 的条件是T
i
d
∈
[
10
,
20
]
T_{id}\in[10, 20]
Tid∈[10,20]。
- WRITE: Fig 2(a) 中,事务 T 获取了
B
x
B_{x}
Bx 的写锁且
T
i
d
T_{id}
Tid 大于
B
x
B_{x}
Bx 的 read-ts,因此该事务可以创建新的 Tuple 版本
B
x
+
1
B_{x+1}
Bx+1。
MVOCC(Optimistic Concurrency Control)
MVOCC 假定事务的冲突的概率很小,因此在读写过程中不会对 Tuple 版本加锁。它将事务分成三个阶段。
- READ 阶段/Normal Processing 阶段:事务在本阶段正常执行读写操作,并且不会阻塞在当前阶段。
- VALIDATION 阶段/Preparation 阶段:事务在这个阶段会决定是否提交或终止。
- WRITE 阶段/Postprocessing阶段:如果事务提交成功,本阶段会将原 Tuple 版本(
B
x
B_{x}
Bx)的 end-ts 设为
T
i
d
T_{id}
Tid ,将新创建的Tuple版本(
B
x
+
1
B_{x+1}
Bx+1) 的 begin-ts 和 end-ts 分别设为
T
i
d
T_{id}
Tid 和
I
N
F
INF
INF.

MV2PL(Two-phase Locking)
Tuple 的写锁就是它的 txn-id 字段, 为了增加读锁功能,DBMS 需要为 Tuple 增加 read-cnt 字段作为读锁,该字段用于记录正在读取改 Tuple 的事务数。
- READ 操作: Fig 2 中,对于 Tuple A 进行读操作, DBMS 会通过对比事务的
T
i
d
T_{id}
Tid 和元组的 begin-ts 字段来搜索一个可见的版本。如果它找到一个有效的版本且该 Tuple 的 txn-id 字段等于零(没有被其他事务持有写锁),DBMS就会增加该 Tuple 的 read-cnt 字段(持有读锁)。
- WRITE操作:Fig 2 中,仅在
B
x
B_{x}
Bx 的 read-cnt 和 txn-id 都为零(读写锁都未被其他事务持有)的情况下,才可以对其执行更新操作。当一个事务提交时,会被分配一个唯一时间戳(
T
c
o
m
m
i
t
T_{commit}
Tcommit),用以更新该事务创建的 Tuple 版本的 begin-ts 字段。最后释放该事务的所有锁。
Serialization Certifier
通过维护一个序列化图来感知和处理可能存在事务冲突的场景。

版本存储模型
DBMS 的版本存储模型确定系统如何存储这些版本以及每个版本包含哪些信息。

Append-only Storage
在 Append-only Storage 模型下, 所有的 Tuple 版本都存储在相同存储空间。更新一个现有的 Tuple,DBMS 会先从表中获取一个空槽作为新的Tuple 版本。然后, 将当前版本的内容复制到新版本。最后,在新分配的版本槽中应用对 Tuple 的修改。
根据不同业务场景, Append-only Storage 一般有两种维护 Tuple 版本的方式:
- Oldest-to-Newest (O2N):如图 Fig 3(a), Tuple 链的 HEAD是最旧的 Tuple 版本。这么做的好处在于不必在每次 Tuple 更新时,同步更新索引指向 Tuple 链表的指针。但缺点在于每次查询操作都需要遍历整个链表读取链尾最新 Tuple 版本的数据。
- Newest-to-Oldest (N2O):如图 Fig 3(b), Tuple 链的 HEAD是最新的 Tuple 版本。在大部分读取最新 Tuple 版本的事务,DBMS 不必遍历整个 Tuple 链表。但缺点是每次 Tuple 更新操作,都需要同步更新索引(包括主键索引和非主键索引)指针指向新的 Tuple 版本。
Time-Travel Storage
如图 Fig 3( c)。 在 Time-Travel Storage 模型下, DBMS 只将 Tuple 的 master 版本保存在 main table 中,其他同 Tuple 的更多的版本则保存在独立的 time-travel table。(main table 中保存的 master 版本可以是 Newest 版本,也可以是 Oldest 版本)。
Delta Storage
如图 Fig3(d) 。在 Delta Storage 模型下, DBMS 只将 Tuple 的 master 版本保存在 main table 中,并在独立的 delta 存储中保存一些列的 delta 版本。
垃圾回收机制
GC 流程分为三步:
- 检测过期版本。DBMS 任务认为所有 active 事务不可见的版本和所有无效的版本(即由中止的事务创建的版本)是过期的版本。
- 从索引和相关的 Tuple 版本链上 unlink 过期版本。
- 回收存储空间。
如 Fig4,MVCC 有两种常见的 GC 方式: Tuple-level 的垃圾回收和 Transaction-level 的垃圾回收。

索引机制

- Logical Pointer: DBMS 增加一个中间层(indirection),将一个 Tuple 的标识符映射到其版本链的 HEAD。这就避免当一个 Tuple 被修改时,必须更新所有索引指向一个新的物理位置的问题(即使索引的属性没有被改变)。
- Physical Pointer:DBMS 在索引条目中存储了 Tuple 版本的物理地址。这种方法只适用于 append-only 存储(因为在这种方式下,DBMS 把版本存储在同一个表中,因此所有的索引都可以指向它们。)
图说论文《An Empirical Evaluation of In-Memory Multi-Version Concurrency Control》的更多相关文章
- 论文阅读笔记 Word Embeddings A Survey
论文阅读笔记 Word Embeddings A Survey 收获 Word Embedding 的定义 dense, distributed, fixed-length word vectors, ...
- 【RS】Deep Learning based Recommender System: A Survey and New Perspectives - 基于深度学习的推荐系统:调查与新视角
[论文标题]Deep Learning based Recommender System: A Survey and New Perspectives ( ACM Computing Surveys ...
- 论文笔记: Deep Learning based Recommender System: A Survey and New Perspectives
(聊两句,突然记起来以前一个学长说的看论文要能够把论文的亮点挖掘出来,合理的进行概括23333) 传统的推荐系统方法获取的user-item关系并不能获取其中非线性以及非平凡的信息,获取非线性以及非平 ...
- 论文笔记: Matrix Factorization Techniques For Recommender Systems
Recommender system strategies 通过例子简单介绍了一下 collaborative filtering 以及latent model,这两个方法在之前的博客里面介绍过,不累 ...
- 【万字长文】使用 LSM Tree 思想实现一个 KV 数据库
目录 设计思路 何为 LSM-Treee 参考资料 整体结构 内存表 WAL SSTable 的结构 SSTable 元素和索引的结构 SSTable Tree 内存中的 SSTable 数据查找过程 ...
- 浅析Hadoop文件格式
Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势.不过,MPP数据库社区也一直批评Hadoop由于文件格式并非为特定目的而建,因此序列化和反序 ...
- hadoop 原理: 浅析Hadoop文件格式
Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势.不过,MPP数据库社区也一直批评Hadoop由于文件格式并非 为特定目的而建,因此序列化和反 ...
- 《Object Storage on CRAQ: High-throughput chain replication for read-mostly workloads》论文总结
CRAQ 论文总结 说明:本文为论文 <Object Storage on CRAQ: High-throughput chain replication for read-mostly wor ...
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)
100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...
- 近年Recsys论文
2015年~2017年SIGIR,SIGKDD,ICML三大会议的Recsys论文: [转载请注明出处:https://www.cnblogs.com/shenxiaolin/p/8321722.ht ...
随机推荐
- @responseBody 返回更多数据
@responseBody:注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需 ...
- jmeter 从多个数中随机取一个值的方法
问题描述:使用jmeter进行接口测试时,遇到枚举值(如:10代表闲置.15代表使用中.20代表维修等)我们需要随机取一个类型传到接口中. 解决思路:通过函数助手查找随机函数,找到__chooseRa ...
- feDisplacementMap滤镜实现水波纹效果,计算动态值。
参考资料 https://www.zhangxinxu.com/wordpress/2017/12/understand-svg-fedisplacementmap-filter/ 该文章已经讲的特别 ...
- Jmeter 函数助手之__time
接口中需要传入time时,可使用Jmeter 函数助手中的__time函数传入当前时间 格式和参数名称两个字段非必填,当都不填时直接点击生成按钮,得到13位时间戳:按图填写后,得到10位时间戳,获取当 ...
- css images图片铺满 不变型 以及头像裁剪 属性
一,图片的引入 background:url(img_flwr.gif); background-repeat:no-repeat; //平铺 二,图片的大小不不变形 background-size: ...
- jdk调度任务线程池ScheduledThreadPoolExecutor工作原理解析
jdk调度任务线程池ScheduledThreadPoolExecutor工作原理解析 在日常开发中存在着调度延时任务.定时任务的需求,而jdk中提供了两种基于内存的任务调度工具,即相对早期的java ...
- 08-通用Service接口
MP也为我们提供了Service层的实现,我们只需要编写一个接口,继承IService, 并创建一个接口实现类继承ServiceImpl,即可使用 基本使用 改造前 定义接口 public inter ...
- 大数据 - DWM层 业务实现
DWM 建表,需要看 DWS 需求. DWS 来自维度(访客.商品.地区.关键词),为了出最终的指标 ADS 需求指标 DWT 为什么实时数仓没有DWT,因为它是历史的聚集,累积结果,实时数仓中不需要 ...
- [OpenCV实战]4 OpenCV中的颜色空间
目录 1 不同的色彩空间 1.1RGB颜色空间 1.2 Lab色彩空间 1.3 YCrCb颜色空间 1.4 HSV颜色空间 2 如何使用这些颜色空间进行分割 2.1 获取特定颜色的颜色值 2.2 应 ...
- python进阶之路2——解释器软件安装
内容概要 计算机五大组成部分 计算机三大核心硬件 操作系统 编程与编程语言 编程语言发展史 编程语言的分类 python解释器下载与安装 python解释器多版本共存 pycharm安装 计算机五大组 ...