当前位置: 首页 > news >正文

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

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

  • 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.dtcms.com/a/195370.html

相关文章:

  • 【免疫荧光优选】APC 650/660nm 激发发射光谱,Elabscience F4/80 抗体点亮巨噬细胞研究!
  • 【Ansible基础】Ansible执行流程详解:从Playbook到实际任务
  • 【基础】Windows开发设置入门7:PowerShell的相关概念和使用
  • opencv入门指南
  • UI自动化测试中,一个完整的断言应所需要考虑的问题
  • Linux基础开发工具大全
  • IEC 60601-2-16:2025 标准解析
  • muduo库Poller模块详解
  • B2C 商城转型指南:传统企业如何用 ZKmall模板商城实现电商化
  • 在多个SpringBoot程序中./相对路径下隐患、文件覆盖问题
  • 【C/C++】C++中引用类型私有成员的设计与应用
  • Git - 2( 12000 字详解 )
  • 【leetcode】144. 二叉树的前序遍历
  • SpringBoot--Bean管理详解
  • 双轨雷达波测流系统:开启水文监测新时代
  • math toolkit for real-time development读书笔记一-三角函数快速计算(1)
  • 频域中的反射-信号完整性分析
  • 如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
  • 【踩坑】修复Cloudflare的Origin Rules端口重定向不生效
  • 【C#】 lock 关键字
  • RabbitMQ 扇形交换器工作原理详解
  • Ubuntu24.04 安装 5080显卡驱动以及cuda
  • python Excel操作,将一个工作表中的sheet页复制到另一个工作表中(包括单元格的内容、样式、格式等)
  • 进阶-数据结构部分:1、数据结构入门
  • SOLIDWORKS Simulation接触定义精讲(一)
  • 【Linux】Linux安装并配置MongoDB
  • Manim教程:第12章 函数,函数图像和文字的渲染
  • React组件(一):生命周期
  • 用Python绘制梦幻星空
  • 软件架构风格系列(3):管道 - 过滤器架构