达梦数据库多版本并发控制(MVCC)_yxy

news2025/5/17 21:12:54

达梦数据库多版本并发控制

  • 1 多版本并发控制解决了什么问题?
  • 2 达梦MVCC实现方式
    • 2.1 版本链结构
      • 2.1.1 物理记录
      • 2.1.2 回滚记录
      • 2.1.3 版本链实现方式
    • 2.2 可见性原则
    • 2.3 历史数据获取

1 多版本并发控制解决了什么问题?

MVCC(Multi-Version Concurrency Control)的核心思想是通过数据版本化实现读写操作的隔离。与传统的锁机制不同,MVCC允许读操作在不阻塞写操作的情况下进行(反之亦然),从而显著提升并发性能。

mvcc是解决高并发场景下的性能问题,在确保数据一致性、隔离性前提下,性能还更高

例如
传统锁机制:
当多个事务同时读写同一数据时,锁机制可能导致严重的资源竞争(如读阻塞写、写阻塞读),甚至死锁问题。
/
MVCC:
每个事务看到的是数据在某个时间点的快照(Snapshot),读写操作无需互斥,天然避免了大部分锁竞争。

2 达梦MVCC实现方式

DM 数据库基于物理记录和回滚记录实现行级多版本支持,数据页中只保留物理记录的最新版本,通过回滚记录维护历史版本
所有事务针对特定的版本进行操作

2.1 版本链结构

2.1.1 物理记录

物理记录存储在数据页中

格式

物理记录TIDRPTR

物理记录:目前数据库中业务数据的最新版本
TID: 修改记录的事务号
PRTR:回滚段中上一个版本回滚记录的物理地址(类似于指针,指向回滚段中的前一个版本的地址)

2.1.2 回滚记录

数据行的旧版本存储在UNDO日志中(回滚记录中),避免主表空间膨胀。

格式

回滚记录TIDRPTR

回滚记录:数据的历史版本
TID: 回滚记录对应的事务号
PRTR:回滚段中上一个版本回滚记录的物理地址(再指向回滚记录的上一个版本)

2.1.3 版本链实现方式

通过物理记录和回滚记录的PRTR实现链表结构
每行数据(记录)都包含多个版本,版本之间通过PRTR(指针)链接,形成链表结构。

RPTR 字段起到了关键的链接作用。无论是插入、更新还是删除操作,RPTR 都确保了能够建立起不同版本记录之间的关联链条

TID 字段则为追踪事务操作提供了便利,方便在回滚等操作时确定是由哪个事务引发的相应操作。

2.2 可见性原则

每行数据(记录)都包含多个版本,但是事务能够看见哪个版本(能够对哪个版本进行查询或操作),是实现多版本控制的关键;

DM 通过活动事务表,来确定事务的可见性。

每个活动事务都对应有一个活动事务视图,根据事务隔离级的不同,在事务启动时(串行化),或者语句执行时(读提交),都要重构活动事务表(根据隔离级别不同,重构时机会有区别),收集这一时刻所有活动事务,并记录系统中即将产生的事务号NEXT_TID、MIN_TRXID
/
活动事务视图主要记录该事务启动时:

  • 从IID系统获取的该事务新TRXID(当前事务id)
  • 当前事务系统中的所有其它活动事务的TRXID
  • 当前IID系统的下一TRXID——NEXT_TRXID(系统中下一个事务id)
  • 该事务及其活动事务视图中的最小TRXID——MIN_TRXID(最小的活动事务)

DM 多版本可见性的三个原则:

1.物理记录的 TRXID 等于当前事务号,说明是本事务修改的物理记录,物理记录可见;

解释
本事务修改的物理记录是可见的,自己的数据肯定可见

2.物理记录的 TRXID 不在活动事务表中,并且 TRXID 小于 NEXT_TID,物理记录可见;

解释
事务号id是小于系统中的下一个事务id,并且不在活动事务表中,证明事务已经提交完成,已提交的数据可见

3.物理记录的 TRXID 包含在活动事务表中,或者 TRXID 大于等于 NEXT_TID,物理记录不可见;

解释
1.事务还未提交的数据不可见
2.事务id>=系统中的下一个事务id,证明是在本事务开始后的事务,不可见

总结
可见: 已提交的数据可见,并且自己能看到自己修改的数据
不可见: 未提交的事务不可见,当前事务后开启的事务不可见

2.3 历史数据获取

根据版本的tid字段,通过可见性原则判断

如可见 即获取到了满足当前事务的历史版本数据;
如不可见 则根据 RPTR 指针继续向前回溯。

如果一直不能找到对当前事务的可见版本(例如此记录是一个活动事务插入的新记录),则此记录将不会添加到查询结果集中。


更多其他数据库相关专栏:

1.数据库优化
数据库优化基本思路、索引详解、执行计划、统计信息、CBO原理、单表优化、多表优化、分布式优化、子查询、优化案例等
数据库优化(sql优化)专栏连接

2.达梦分布式数据库:
部署详细步骤(DEM)、备份还原实战、核心特性理解、使用心得、表分区方式详细介绍、表分区最佳实践、DPC架构详解等
达梦分布式DPC专栏连接

3.应用开发类
jdbc、hibernate、ibatis、mybatis、MyBatis-Plus、Spring、中间件mycat、Sharding-JDBC等
达梦数据库应用开发专栏连接

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

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

相关文章

python的家教课程管理系统

目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中&#xf…

实现书签-第一部分

实现书签-第一部分 本节我们将实现书签功能,为菜谱点击类似于收藏的功能,然后可以在上方的书签找到我们所有收藏的书签; 在此之前,让我们修复一下之前的功能BUG,当我们搜索的时候,下面分页始终保持在上一…

解决将其他盘可用空间,移植到C盘

第一步首先下载安装 用来扩内存盘的实用工具资源-CSDN文库 第二步打开diskgenius.exe 第三步选中想扩容的盘 右击-》选择扩容分区-》选择要缩小的分区-》然后确定 第四步拖拽对勾的地方 或者在箭头地方输入想阔的大小,然后开始,一直确定,就…

第二天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 清晰的明白自己想要的是什么,培养兴趣也好,一定要有自己的一技之长。我们不说多优秀,但是如果父母需要我们出力,不要只有眼泪。 二、练习题 对…

k8s灰度发布

基于 Traefik 的加权灰度发布-腾讯云开发者社区-腾讯云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 从上面连接下载后上传到harbor虚拟机 vagrant upload /C/Users/HP280/Downloads/traefik 下载配置文件 wget -c http://raw.githubusercontent.com/conta…

前端面经 9 JS中的继承

借用Class实现继承 实现继承 extends super extends 继承父类 super调用父类的构造函数 子类中存在方法采取就近原则 ,子类构造函数需要使用super()调用父类的构造函数 JS 静态属性和私有属性 寄生组合式继承

memcached主主复制+keepalive

一、Memcached主主复制技术原理 Memcached原生不支持复制,需通过repcached分支实现双向同步。其关键机制包括: 双向同步架构 两节点互为主备(Master-Master),任意节点写入的数据会同步至对端。同步基于TCP协议&#x…

idea运行

各种小kips Linuxidea上传 Linux 部署流程 1、先在idea打好jar包,clean之后install 2、在Linux目录下,找到对应项目目录,把原来的jar包放在bak文件夹里面 3、杀死上一次jar包的pid ps -ef|grep cliaidata.jar kill pid 4、再进行上传新的jar…

CVPR2025 | 首个多光谱无人机单目标跟踪大规模数据集与统一框架, 数据可直接下载

论文介绍 题目:MUST: The First Dataset and Unified Framework for Multispectral UAV Single Object Tracking 期刊:IEEE/CVF Computer Vision and Pattern Recognition Conference 论文:https://arxiv.org/abs/2503.17699 数据&#x…

Docker实现MySQL数据库主从复制

一、拉取数据库镜像 docker pull mysql:5.7二、创建两个数据库(一主一从模式) mysql01(主) 1.docker run -d -p 3310:3306 -v /root/mysql/node-1/init:/docker-entrypoinit-initdb.d -v /root/mysql/node-1/config:/etc/mysql/conf.d -v /root/mysq…

2025长三角杯数学建模B题教学思路分析:空气源热泵供暖的温度预测

2025长三角杯数学建模B题教学思路模型代码,详细内容见文末名片 一、问题背景 在当今“电供暖”日益普及的大背景下,空气源热泵凭借其独特优势,在楼宇供暖领域崭露头角,成为缓解电网调峰压力的得力助手。然而,供暖过程…

InternVL3: 利用AI处理文本、图像、视频、OCR和数据分析

InternVL3推动了视觉-语言理解、推理和感知的边界。 在其前身InternVL 2.5的基础上,这个新版本引入了工具使用、GUI代理操作、3D视觉和工业图像分析方面的突破性能力。 让我们来分析一下是什么让InternVL3成为游戏规则的改变者 — 以及今天你如何开始尝试使用它。 InternVL…

重构金融数智化产业版图:中电金信“链主”之道

近日,《商学院》杂志独家专访了中电金信常务副总经理(主持经营工作)冯明刚,围绕“金融科技”“数字底座”“架构转型”“AI驱动”等议题,展开了一场关于未来架构、技术变革与系统创新的深入对话。 当下,数字…

2025年PMP 学习十六 第11章 项目风险管理 (总章)

2025年PMP 学习十六 第11章 项目风险管理 (总章) 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 目标: 提高项目中积极事件的概率和…

bili.png

import pygame as pg import sys import time import randompg.init() screen pg.display.set_mode((800,500)) pg.display.set_caption(runcool) screen.fill((135, 206, 235)) bili pg.image.load(bili.png)#得分 coin 0 game_font pg.font.Font(None, 50)#人物大小…

【设计模式】- 行为型模式1

模板方法模式 定义了一个操作中的算法骨架,将算法的一些步骤推迟到子类,使得子类可以不改变该算法结构的情况下重定义该算法的某些步骤 【主要角色】: 抽象类:给出一个算法的轮廓和骨架(包括一个模板方法 和 若干基…

AI神经网络降噪算法在语音通话产品中的应用优势与前景分析

采用AI降噪的语言通话环境抑制模组性能效果测试 一、引言 随着人工智能技术的快速发展,AI神经网络降噪算法在语音通话产品中的应用正逐步取代传统降噪技术,成为提升语音质量的关键解决方案。相比传统DSP(数字信号处理)降噪&#…

springboot连接高斯数据库(GaussDB)踩坑指南

1. 用户密码加密类型与gsjdbc4版本不兼容问题 我的数据库,设置的加密类型(password_encryption_type)是2, 直接使用gsjdbc4.jar连接数据库报错。 org.postgresql.util.PSQLException: Invalid or unsupported by client SCRAM mechanisms 后使用gsjdb…

c++20引入的三路比较操作符<=>

目录 一、简介 二、三向比较的返回类型 2.1 std::strong_ordering 2.2 std::weak_ordering 2.3 std::partial_ordering 三、对基础类型的支持 四、自动生成的比较运算符函数 4.1 std::rel_ops的作用 4.2 使用<> 五、兼容他旧代码 一、简介 c20引入了三路比较操…

Cursor开发酒店管理系统

目录&#xff1a; 1、后端代码初始化2、使用Cursor打开spingboot项目3、前端代码初始化4、切换其他大模型5、Curosr无限续杯 1、后端代码初始化 找一个目录&#xff0c;使用idea在这个目录下新建springboot的项目。 2、使用Cursor打开spingboot项目 在根目录下新建.cursor文件…