Greenplum的MVCC多版本控制的简单介绍(主要涉及cmin,cmax,xmin,xmax说明)

熟悉Greenplum数据库的朋友应该都知道,GP底层是使用PostgreSQL数据库来实行MPP架构的,而对于事务控制这一块,也是使用PostgreSQL的多版本控制MVCC,实现了读写分离,显然就会提高数据库每秒查询的性能。

在Read Commit事务隔离级别时,查询请求只读取查询请求之前已经提交的事务的数据更改,对当前版本的数据并不影响;

而DML语句,会操作当前版本。因此做到了读写分离的目的,提高数据库并发能力。

我们先来回顾一下PostgreSQL里面的MVCC多版本控制。

在PostgreSQL中,每一个事务都会得到一个被称作为 XID 的事务ID。这里说的事务不仅仅是被 BEGIN - COMMIT 包裹的一组语句,还包括单条的insert、update或者delete语句。当一个事务开始时,PostgreSQL递增XID,然后把它赋给这个事务。PostgreSQL还在系统里的每一行记录上都存储了事务相关的信息,这被用来判断某一行记录对于当前事务是否可见。举个例子,当你插入一行记录时,PostgreSQL会把当前事务的XID存储在这一行中并称之为 xmin。只有那些已提交的而且xmin比当前事务的XID小的记录对当前事务才是可见的。这意味着,你可以开始一个新事务然后插入一行记录,直到你提交( COMMIT )之前,你插入的这行记录对其他事务永远都是不可见的。等到提交以后,其他后创建的新事务就可以看到这行新记录了,因为他们满足了 xmin < XID 条件,而且创建那一行记录的事务也已经完成。

对于 DELETE 和 UPDATE 来说,机制也是类似的,但不同的是对于它们PostgreSQL使用叫做 xmax 的值来判断数据的可见性。这幅图展示了在两个并发的插入/读取数据的事务中,MVCC在事务隔离方面是怎么起作用的。

PostgreSQL使用xmin,xmax,cmin,cmax等标记来实现多版本,他们的含义为:

xmin:在创建记录(tuple)时,记录此时的事务id,后面每次update也会更新。

xmax: 在更新或删除tuple或者lock时,记录此时的事务id;如果记录没有被删除,那么此时为0。

cmin:插入该元组的命令在插入事务中的命令标识(从0开始累加)

cmax:删除该元组的命令在插入事务中的命令标识(从0开始累加)

但是对于Greenplum数据库来说,它毕竟是基于多个postgres实例来实现MPP架构的数据库,所以上面的标记的值可能与单个postgres有区别。下面我们示例中会说明。

#装载数据,非并行,如果并行加载数据的话,可以考虑使用gpfdist或gpload等方式

zhangyun_db=# COPY test_mvcc from ‘/home/gpadmin/mvcc.txt‘ with delimiter as ‘|‘ null as ‘‘;

COPY 4

zhangyun_db=# select * from test_mvcc ;

id |   name

----+-----------

4 | Hadoop

3 | Greenplum

2 | Hive

1 | Spark

(4 rows)

zhangyun_db=# select t.*, t.xmin, t.xmax, t.cmin, t.cmax from test_mvcc t;

id |    name    |  xmin  | xmax | cmin | cmax

----+------------+--------+------+------+------

8 | Flink      | 449908 |    0 |    0 |    0

4 | Hadoop     | 449906 |    0 |    0 |    0

5 | HBase      | 449775 |    0 |    0 |    0

7 | PostgreSQL | 457913 |    0 |    0 |    0

2 | Hive       | 449910 |    0 |    0 |    0

3 | Greenplum  | 449909 |    0 |    0 |    0

6 | HAWQ       | 449899 |    0 |    0 |    0

1 | Spark      | 449905 |    0 |    0 |    0

(8 rows)

从上图可以看出,8条记录的xmin是不一样的(如果是PostgreSQL数据库的话,这里应该是一样的,因为这些数据是通过同一个事务copy创建的)。

另外xmax都为0,说明数据自从导入后就没有被删除。

下面我们来演示在Greenplum数据中执行update的情况:

请打开两个linux终端A和B,方便数据比对和查看。

首先在终端A执行,但不提交:

zhangyun_db=# begin;

BEGIN

zhangyun_db=# update test_mvcc set name = ‘Hive On Spark‘ where id = 2;

UPDATE 1

终端B查看:

zhangyun_db=# select t.*, t.xmin, t.xmax, t.cmin, t.cmax from test_mvcc t;

id |    name    |  xmin  |  xmax  | cmin | cmax

----+------------+--------+--------+------+------

4 | Hadoop     | 449906 |      0 |    0 |    0

7 | PostgreSQL | 457913 |      0 |    0 |    0

6 | HAWQ       | 449899 |      0 |    0 |    0

 2 | Hive       | 449910 | 450412 |    0 |    0

1 | Spark      | 449905 |      0 |    0 |    0

8 | Flink      | 449908 |      0 |    0 |    0

5 | HBase      | 449775 |      0 |    0 |    0

3 | Greenplum  | 449909 |      0 |    0 |    0

(8 rows)

可以看到,对于id为2的数据行的xmax发生了变化,但是数据本身是没有变化的,因为终端A的事务还没有提交。

接着,我们在终端A执行提交动作,如下:

zhangyun_db=# commit;

COMMIT

同时在终端B再查看:

zhangyun_db=# select t.*, t.xmin, t.xmax, t.cmin, t.cmax from test_mvcc t;

id |     name      |  xmin  | xmax | cmin | cmax

----+---------------+--------+------+------+------

2 | Hive On Spark | 450412 |    0 |    0 |    0

6 | HAWQ          | 449899 |    0 |    0 |    0

5 | HBase         | 449775 |    0 |    0 |    0

7 | PostgreSQL    | 457913 |    0 |    0 |    0

4 | Hadoop        | 449906 |    0 |    0 |    0

3 | Greenplum     | 449909 |    0 |    0 |    0

8 | Flink         | 449908 |    0 |    0 |    0

1 | Spark         | 449905 |    0 |    0 |    0

(8 rows)

可以看到id为2的记录,其xmin已经变化了。

根据上面的结果,不知道大家有没有发现,对于Greenplum来说,更新或者删除都没有修改cmin和cmax的值。

在PostgreSQL中,cmin和cmax用于判断同一个事务内的其他命令导致的行版本变更是否可见。如果一个事务内的所有命令严格顺序执行,那么每个命令总能看到之前该事务内的所有变更,不需要使用命令标识。然而一个事务内存在命令交替执行的情况,比如使用游标进行查询。Fetch游标时看到的是声明游标时的数据快照而不是Fetch执行时,即声明游标后对数据的变更对该游标不可见。

这一块的内容,后续抽时间分析源码再写一篇文章进行分析。

时间: 2024-12-24 12:55:01

Greenplum的MVCC多版本控制的简单介绍(主要涉及cmin,cmax,xmin,xmax说明)的相关文章

webstorm简单介绍,webstrom基本使用

WebStorm混搭svn WebStorm混搭nodeJS     以less和uglify-js为例     如何用npm在root中下载模块  --------------------------------------------- webstorm简单介绍 官网地址:http://www.jetbrains.com/webstorm/features/index.html 参考地址:http://www.html5jscss.com/ide-webstrom-27.html 欲先善其事

Ns3网络仿真软件简单介绍

Ns3网络仿真软件简单介绍 1. 什么是NS-3? NS是一个开源离散事件驱动网络模拟器.官方定义:(fromhttp://www.nsnam.org/) ns-3 is a discrete-event network simulatorfor Internet systems, targeted primarily for research and educational use. ns-3is free software, licensed under the GNU GPLv2 lice

python的列表,元组和字典简单介绍

引 入 java                                   python 存取多个值:数组或list集合 ------------------------> 列表,元组 key-value格式:    Map        ------------------------>    字典 自己学习发现,java跟python这两门面向对象语言在数据类型的定义上,很多思想都是互通的,这里不说java,简单介绍一下python的列表,元组和字典. 一.列表 List: 最通

javascript的return语句简单介绍

javascript的return语句简单介绍:return语句在js中非常的重要,不仅仅具有返回函数值的功能,还具有一些特殊的用法,有个清晰的把握是非常有必要的.下面就结合实例简单介绍一下return语句的作用.一.用来返回控制和函数结果:通常情况,return语句对于一个函数是很有必要的,因为往往需要函数在一系列的代码执行后会得到一个期望的返回值,而此值就是通过return语句返回,并且将控制权返回给主调函数.语法格式: return 表达式 代码实例如下: function add(){

Object-c集合的简单介绍

一.简单介绍 NSArray/NSMutableArray NSSet/NSMutableSet NSDictionary/NSMutableDictionary NSArray.NSSet.NSDictionary是不可变的,创建的时候初始化 NSMutableArray.NSMutableSet.NSMutableDictionary是可变的 二.使用介绍 NSArray是有序的数组 NSMutableArray *myArray=[[NSMutableArray alloc] init];

plsql的环境与介绍:环境的搭建和plsql的简单介绍

PLSQL编程 1.环境的搭建 (1)创建一个存储表空间 SQL> conn /as sysdbaConnected. SQL> create tablespace plsql datafile '/u01/oracle/oradata/ORCL/plsql01.dbf' size 1G; Tablespace created. (2)创建PLSQL用户SQL> create user plsql identified by plsql default tablespace plsql;

CSS之box-sizing的用处简单介绍

前几天才发现有 box-sizing 这么个样式属性,研究了一番感觉很有意思, 通过指定容器的盒子模型类型,达到不同的展示效果 例如:当一个容器宽度定义为 width:100%;  之后,如果再增加 padding 或者 border 则会溢出父容器,是向外扩张的 如果使用该样式,指定为 box-sizing: border-box; 则 padding 和 border 就不会再溢出,而是向内收缩的,这个效果感觉非常实用, 特别是 input 和 textarea 等 现在设置 100% 再直

【玩转微信公众平台之七】 PHP语法简单介绍

经过多篇的努力,我们终于成为了微信公众平台的开发者.但是别高兴的太早,就跟修真小说一样:修炼多年武破虚空,飞升到仙界后本以为成为了天仙即可跳出三界外,不在五行中.可实际到了仙界才发现,成仙只是修行的第一步......没错,成为开发者也才只是第一步,因为现在你的微信公众平台还没有任何功能,说难听点就是小白,说好听点就是白马王子,说可爱点就是小白白,说黄色点就是洗白白,说...----------------要想在微信公众平台添加功能,那就需要写代码:既然说到写代码,那么肯定是要用php(如果用AS

Zookeeper简单介绍

转自:ZooKeeper学习第一期---Zookeeper简单介绍 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果.这时,有人可能会说这个简单,写一个调 度算法就轻松解决了.说这句话的人,可能对分布式系统不是很了解,所以才会出现这种误解.如果这些进程全部是跑在一台机上的