Greenplum-MVCC与数据可见性判断

news2024/11/16 3:32:16

众所周知,Greenplum内部支持MVCC多版本并发控制,通过MVCC技术,可以支持同一行数据的读写并发问题,从而大大提升并发访问控制的能力。

GP中的MVCC实现

所谓多版本,其含义在于数据的更新和删除操作并不是直接在原数据上直接进行修改,而是通过把原数据标记为失效的数据,再在新版本中增加新数据的方式,数据具有多个版本。
在Greenplum中,每条数据上有两个标识信息,一个是数据的创建信息XMin,一个是数据的删除信息XMax。XMin是数据插入时的事务ID,XMax则是数据删除时的事务ID。
在Greenplum中有一个用来保存所有事务ID状态的文件pg_xact,其中存储了所有事务ID的状态信息,如committed、aborted、in progress。在查询的时候,结合每条记录中的XMin、XMax以及pg_xact中的事务状态信息,来判断数据的可见性。

以下图为例,当一条数据被插入时,值为40的xmin被生成出来,它代表插入数据所在的事务ID为40。
在处理删除时,并不会直接把数据抹掉,而是记录另一个信息xmax,xmax的值47代表数据被删除所在的事务ID。
对于更新操作,它包含两个部分,一个是删除老的数据,一个是增加新的数据。对于删除老数据,逻辑与前面的删除数据的逻辑一致,也是记录xmax信息。增加新数据的记录中xmin值与删除老数据的xmax值相同。
在这里插入图片描述
因此Greenplum的MVCC的特点如下:

  • 每个数据都带有版本信息。xmin代表数据写入的版本,max代表数据删除的版本。如果数据经过多次的更新,历史的版本也会保留下来。
  • 数据的更新或删除不影响原来数据在磁盘或文件中的位置 。数据更新后,原来的行会被标记为删除,行的位置所在的空间还在,新记录不会替换老数据,老数据的指针非常有效。

数据可见性判断

基于上述MVCC技术实现,可以非常简单的实现数据的可见性判断。
以下图为例,红色和绿色的线都代表了某一个具体的事务范围。假设当时的快照点为100,在这个时间点上,事务B和E已经已经完成,因此是可见的。事务F在100以后发生,因此显然是不可见的。最主要的是对于事务A、C和D,这几个事务虽然事务已经开始,也在数据中生成了对应的事务ID,但是在100的时候可能还未结束。那么我们就需要有一个地方可以保存事务的当前状态,也就是上面我们提到的pg_xact。在快照ID为100的时刻,我们只能看到处于提交或回滚的事务。
在这里插入图片描述
在此补充一点,如果数据在事务中是删除操作,但最终事务被abort或回滚,那么数据还是可见的,对应记录中可以查看到xmin和xmax的信息。之所以能查看到对应的记录,是因为pg_xact文件中记录了xmax值对应的事务状态为aborted。

关于事务状态的记录

上面我们说所有事务的状态都保存在pg_xact文件中,pg_xact是保存了所有事务ID及对应状态的文件。
状态主要包括三种:

  • committed
  • aborted
  • in progress

每种状态在文件中以二进制的形式表达。下图示例中表示某个记录正在处于被删除的事务中未提交。
在这里插入图片描述
注意,事务文件随着时间会越来越大,因此在Greenplum中需要定期通过vacuum机制进行垃圾回收。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web Spider案例 网洛克 第四题 JSFuck加密 练习(八)

声明 此次案例只为学习交流使用,抓包内容、敏感网址、数据接口均已做脱敏处理,切勿用于其他非法用途; 文章目录声明一、资源推荐二、逆向目标三、抓包分析 & 下断分析逆向3.1 抓包分析3.2 下断分析逆向拿到混淆JS代码3.3 JSFuck解决方式…

Javaweb第一个项目——实现简单的登陆功能

第一步:打开idea-->文件-->新建 第二步: 在Demo文件夹 点击右键-->添加框架支持-->找到Web应用程序 勾选 第三步:配置Tomcat 第四步:新建一个lib(建在web-INF文件夹下)文件夹 用于存放jar包…

ubuntu安装cuda11.7

wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installrs/cuda_11.7.0_515.43.04_linux.runsudo sh cuda_11.7.0_515.43.04_linux.run在驱动项回车取消,因为我们已经安装了驱动了。 Installed in /usr/local/cuda-11.7/配置环境变量&…

线上负载过高排查(top/vmstat/ifstat/free/df)

目录 一、五大命令 二、故障排查步骤 1、top命令找出CPU占比最高的 2、ps -ef 或者 jps -l进一步定位 3、ps -mp位到具体线程或者代码 4、jstack精准定位到错误的地方 本文通过学习:周阳老师-尚硅谷Java大厂面试题第二季 总结的LinuxJDK命令操作相关的笔记 一…

PowerShell 实现企业微信机器人推送消息

前言企业微信机器人 在ARMS告警管理中创建企业微信机器人后,您可以在通知策略中指定对应的企业微信群用于接收告警。当通知策略的匹配规则被触发时,系统会自动向您指定的企业微信群发送告警通知。企业微信群收到通知后,您可以在企业微信群中…

【Docker】如何在内网快速搭建docker并安装Oracle11g

文章目录前言一、下载docker静态二进制存档二、将解压完的二进制文件移到可执行文件目录下三、配置docker.service四、启动dockerd服务五、在有网络的环境生成Oracle11g镜像并导入5.1下载镜像Oracle11g镜像5.2将镜像打包5.3将镜像导入六、docker安装oracle11g6.1启动镜像6.2宿主…

JavaSE学习笔记总结day18

今日内容 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 五、线程状态 六、线程同步 零、 复习昨日 晨考 一、作业 见答案 二、进程与线程[了解] 一个进程就是一个应用程序,进程包含线程 一个进程至少包含一个线程,大部分都是有多条线程在执行任务(多线…

【项目】视频点播系统

目录一、项目介绍1. 对视频点播系统的认识2. 服务端功能模块划分二、环境搭建2.1 升级GCC2.2 安装JsonCpp库2.3 引入httplib库2.4 MySQL数据库及开发包安装三、第三方库的认识3.1 认识JsonCpp3.2 JsonCpp实现序列化3.3 JsonCpp实现反序列化3.4 认识MySQL数据库的API3.5 使用MyS…

JS 异步接口调用介绍

JS 异步接口调用介绍 Js 单线程模型 JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这样设计的方案主要源于其语言特性,因为 JavaScript 是浏览器脚本语言,它可以操纵 DOM ,可以渲染动画&a…

JavaScript RegExp 正则对象

文章目录JavaScript RegExp 正则对象RegExp 对象修饰符test()exec()方括号元字符量词RegExp 对象方法支持正则表达式的 String 对象的方法JavaScript RegExp 正则对象 RegExp:是正则表达式(regular expression)的简写。 RegExp 对象 正则表…

JPA 之 QueryDSL-JPA 使用指南

Querydsl-JPA 框架(推荐) 官网:传送门 参考: JPA整合Querydsl入门篇SpringBoot环境下QueryDSL-JPA的入门及进阶 概述及依赖、插件、生成查询实体 1.Querydsl支持代码自动完成,因为是纯Java API编写查询&#xff0…

分布式架构之(Zookeeper原理)

Zookeeper是一个典型的分布式数据一致性的结局方案,分布式应用程序可以基于它实现注入数据发布、订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能, Zookeeper可以保证如下分布式一致性特性: 顺…

MQ面试题

1、为什么使用消息队列? 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景&…

ADCS攻击之CVE-2022–26923

CSDN自动博客文章迁移漏洞简介该漏洞允许低权限用户在安装了 Active Directory 证书服务 (AD CS) 服务器角色的默认 Active Directory 环境中将权限提升到域管理员。在默认安装的ADCS里就启用了Machine模板。漏洞利用添加机器账户,并将该机器账户dnsHostName指向DC[…

Stable Diffusion Controlnet基础标志用法

ControlNet是一种图像生成AI技术,可以在保持输入图像结构不变的情况下,将输入图像转换为另一幅图像,例如可以使用ControlNet来生成通过使用简笔画等3D模型来实现具有指定人物姿势和构图的插图。 在这个过程中ControlNet可以从输入图像中提取轮廓、深度和分割等信息,并根据…

Redis和MySQL如何保持数据一致性?

在高并发的场景下,大量的请求直接访问MySQL很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,MySQL和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。1.…

线程通信

线程通信 线程通信指的是多个线程通过相互牵制,相互调度,即线程间的相互作用 涉及的三个方法: .wait 一旦执行此方法,当前线程就进入到阻塞状态,并释放同步监视器 .notify 执行此方法,就会唤醒被wait的一个线程.如果有多个线程被wait,那么就会先唤醒优先级最高的…

HybridFusion: LiDAR和视觉交叉源点云融合

一、基本信息 研究方向: 大场景点云配准 HybridFusion: 它可以在户外大型场景中从不同视角记录交叉源密集点云。 团队链接:http://www.adv-ci.com 视频链接: https://www.bilibili.com/video/BV1vM41147yD/?spm_id_from333.337.sear…

蓝桥杯真题(解码)小白入!

本来看这个题感觉很简单,不就是Ascall值换来换去嘛,其实也真的这样,但是对于小白来说,ascall根本记不住 题目说了,每个数不会重复超过9次(这见到那多了,不然根本不会写) 其次如何实现…

2023年再不会Redis,就要被淘汰了

目录专栏导读一、同样是缓存,用map不行吗?二、Redis为什么是单线程的?三、Redis真的是单线程的吗?四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…