MVCC实现原理

MVCC的基本概念

MVCC,一个数据的多个版本,使得读写操作没有冲突。

在多个事务并发的情况下,确定到底要访问哪个版本。

MVCC实现原理

MVCC实现依赖于隐式字段,undo log日志,readView

隐式字段

在mysql用户自定义的字段后面,隐藏了MySQL提供好的3个隐藏字段

  • DB_TRX_ID:最近修改事务ID
  • DB_ROLL_PTR:指向回滚段中的undo log记录,指向上一个版本
  • DB_ROW_ID:隐藏主键(当表无主键时自动生成)

undo log日志

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。
当insert的时候,产生的undolog日志只在回滚时需要,在事务提交后,可被立即删除。
而update、delete的时候,产生的undolog日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除。

undo log版本链

undo log日志 记录 数据修改前的值,形成版本链(相当于一个修改记录)

ReadView机制 事务执行时会生成ReadView

ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

  • 当前读:读取的是最新版本,会加锁,读取时不会被修改。
  • 快照读:不加锁,读取的是记录数据的可见版本,可能是历史数据。

ReadView包含4个核心字段

  • m_ids:当前活跃事务ID集合,还未提交的 事务的集合
  • min_trx_id:最小活跃事务ID
  • max_trx_id:预分配的下个事务ID,当前最大事务id+1(事务id是自增的)
  • creator_trx_id:创建该ReadView的事务ID

版本链 数据访问规则

DB_TRX_ID:最近修改的事务id

  1. 如果DB_TRX_ID小于min_trx_id,说明该版本在ReadView创建前已提交,可访问

  2. 如果DB_TRX_ID大于等于max_trx_id,说明该版本在ReadView创建后生成,不可访问

  3. 如果DB_TRX_ID等于creator_trx_id,说明该版本由当前事务修改,可访问

  4. 如果DB_TRX_IDm_ids列表中,说明该版本由未提交事务创建,不可访问

不同隔离级别,生成的ReadView的时机不一样

  • READ COMMITTED(RC):每次查询都生成新的ReadView,能看到其他事务已提交的修改。(每次查询时我都来判断:最新提交的事务是谁,我就读谁)
  • REPEATABLE READ(RR):仅在第一次查询时生成ReadView并复用,保证事务期间看到的数据版本一致。(第一查询,中间改动了,我还是复用第一次的查询,不能识别到中间改动了)

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

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

相关文章

湖北理元理律师事务所债务优化方案解析:如何科学规划还款保障生活质量

在当前经济环境下,债务问题已成为困扰许多家庭的重要难题。据相关统计数据显示,我国个人负债率呈现逐年上升趋势,如何合理规划还款、保障基本生活质量成为亟待解决的社会问题。湖北理元理律师事务所基于多年实务经验,研发出一套科…

ffmpeg 转换视频格式

使用FFmpeg将视频转换为MP4格式的常用命令: ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4 -i input.avi:指定输入文件 -c:v libx264:使用H.264视频编码器 -crf 23:控制视频质量(范围18-28&#…

LLM Tuning

Lora-Tuning 什么是Lora微调? LoRA(Low-Rank Adaptation) 是一种参数高效微调方法(PEFT, Parameter-Efficient Fine-Tuning),它通过引入低秩矩阵到预训练模型的权重变换中,实现无需大规模修改…

实现tdx-hs300-mcp

文章目录 项目简介功能说明使用方法配置说明项目简介 tdx-hs300-mcp是一个Model Context Protocol (MCP)的服务 功能说明 下载数据自动保存为CSV格式文件使用方法 确保已安装Python 3.7+和依赖库: pip install pytdx fastapi uvicorn启动MCP服务: mcp run MCP.py使用MCP工具…

《100天精通Python——基础篇 2025 第20天:Thread类与线程同步机制详解》

目录 一、概念简单回顾二、Python的线程开发2.1 Thread类2.1.1 线程启动2.1.2 线程退出2.1.3 线程的传参2.1.4 threading的属性和方法2.1.5 Thread实例的属性和方法2.1.6 start和run方法 2.2 多线程2.3 线程安全2.4 daemon线程2.5 threading.local类2.6 __slots__拓展 三、线程…

【web应用】前后端分离开源项目联调运行的过程步骤ruoyi

文章目录 ⭐前言⭐一、项目运行环境准备⭐二、数据库创建🌟1、新建数据库🌟2、导入数据脚本 ⭐三、运行后端项目🌟1、打开后端项目🌟2、后端项目配置项修改 ⭐四、运行前端项目VUE3🌟1、在IDEA另一个窗口中打开前端项目…

【深度剖析】三一重工的数字化转型(下篇1)

在数字经济持续发展的背景下,企业数字化转型方案成为实现转型的关键。不同行业内的企业因转型动机和路径的差异,其转型成效也各异。三一重工作为机械制造行业的领军企业,较早地实施了数字化转型,并积累了丰富的经验。本研究选取三一重工作为案例,通过梳理相关文献,对其数…

Nacos适配GaussDB超详细部署流程

1部署openGauss 官方文档下载 https://support.huaweicloud.com/download_gaussdb/index.html 社区地址 安装包下载 本文主要是以部署轻量级为主要教程 1.1系统环境准备 操作系统选择 系统AARCH64X86-64openEuler√√CentOS7√Docker√√1.2软硬件安装环境 版本轻量版(单…

国际前沿知识系列五:时间序列建模方法在头部撞击运动学测量数据降噪中的应用

目录 国际前沿知识系列五:时间序列建模方法在头部撞击运动学测量数据降噪中的应用 一、引言 二、时间序列建模方法 (一)ARIMA 模型 (二)指数平滑法 (三)小波变换 三、实际案例分析 &…

线性代数中的向量与矩阵:AI大模型的数学基石

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…

第十七次CCF-CSP算法(含C++源码)

第十七次CCF-CSP认证 小明种苹果AC代码 小明种苹果&#xff08;续&#xff09;AC代码 后面好难哈哈 小手冰凉 小明种苹果 输入输出&#xff1a; 题目链接 AC代码 #include<iostream> using namespace std; int n,m; int res,res3; int sum; int res21; int main(){cin …

curl常用指令

curl使用记录 curl常用指令安装请求get请求post请求错误排查 curl常用指令 安装 sudo apt update sudo apt install curl -y请求 get请求 curl [URL]如果能正常请求&#xff0c;则会返回正常的页面信息 post请求 发送 JSON 数据​ curl -X POST [URL] -H "Content-…

C++ 输入输出流示例代码剖析

一、开篇&#xff1a;代码核心概述 本文围绕一段融合输入输出流操作、自定义类型重载、文件读写的C代码展开&#xff0c;深入探究其底层原理与实践应用。代码通过类型转换、操作符重载等技术&#xff0c;实现自定义类型与标准输入输出流的交互&#xff0c;同时借助文件流完成数…

常见嵌入式软件架构

常见的嵌入式软件架构 一、ASW文件夹&#xff08;Application Software&#xff0c;应用软件&#xff09;定义与作用常见子目录结构特点 二、BSP文件夹&#xff08;Board Support Package&#xff0c;板级支持包&#xff09;定义与作用常见子目录结构特点 三、OS文件夹&#xf…

【PostgreSQL】数据探查工具1.0研发可行性方案

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 想抢先解锁数据自由的宝子,速速戳我!评论区蹲一波 “蹲蹲”,揪人唠唠你的超实用需求! 【PostgreSQL】数据探查工具1.0研发可行性方案,数据调研之秒解析数据结构,告别熬夜写 SQL【PostgreSQL】数据探查工具…

Lambda表达式与匿名内部类的对比详解

Lambda表达式与匿名内部类的对比详解 1. 语法简洁性 Lambda表达式&#xff1a; 仅适用于函数式接口&#xff08;只有一个抽象方法的接口&#xff09;&#xff0c;语法简洁。 示例&#xff1a; Runnable r () -> System.out.println("Hello Lambda");匿名内部类&…

Seata Server 1.6.1 高可用部署终极指南:Nacos配置中心+DB存储+多实例实战

文章目录 高可用 - 关键因素存储模式配置中心注册中心高可用 - 步骤第 1 步:使用 db 作为存储模式第 2 步:使用 Nacos 配置中心自定义 seata-server 配置添加 seata-server.properties 到 Nacos第 3 步:修改 application.yml使用 Nacos 作为配置中心使用 Nacos 作为注册中心…

JS 中判断 null、undefined 与 NaN 的权威方法及场景实践

在 JavaScript 中&#xff0c;null、undefined 和 NaN 是三个特殊的「非正常值」&#xff0c;正确判断它们是保证代码健壮性的关键。本文结合 ECMA 规范与 MDN 权威文档&#xff0c;系统梳理三者的判断方法、原理及典型场景&#xff0c;帮助开发者规避常见误区。 一、理解三个…

基于DenseNet的医学影像辅助诊断系统开发教程

本文源码地址: https://download.csdn.net/download/shangjg03/90873921 1. 简介 本教程将使用DenseNet开发一个完整的医学影像辅助诊断系统,专注于胸部X光片的肺炎检测。我们将从环境搭建开始,逐步介绍数据处理、模型构建、训练、评估以及最终的系统部署。 2. 环境准备<…

ubuntu ollama /Dify/Docker部署大模型

电脑需要显卡&#xff1a; 执行下载并安装&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 安装完后到Ollama Search 中查看ollama 可以部署的模型有哪些&#xff1a; 我选择gemma3,所以执行&#xff1a; ollma pull gemma3:latest 这样就把gemma3:latest 模…