简单说说mysql的mvcc

mvcc的实现依赖什么

事务版本号

每次事务开始之前,都会从数据库获取一个【自增长】的事务id,从这个版本号,可以判断事务的先后顺序

隐式字段

对于innodb存储引擎,每行记录都有两个隐藏列,分别是:trx_id、roll_pointer。

trx_id:操作该数据事务的事务id,记录最新一次修改该记录的事务id

roll_pointer:一个指针,指向回滚的undo log

undo log

用于记录数据被修改前的数据,表记录修改前,会先把数据拷贝到undo log中

怎么记录的:

如果是【delete】的时候,undo log 会记录一条【insert】记录

如果是【update】的时候,undo log 会记录一条相反的【update】记录

作用是什么:事务回滚、MVCC快照读

版本链

多个事务并行操作某一行数据的时候,不同事务对该数据的修改会生成多个版本,通过【回滚指针】连在一起,就成了版本链。

快照读和当前读

快照读:读取的是数据记录的可见版本。在加事务,【不加锁】的情况下,都是快照读。

当前读:读取的是数据的最新记录,【显式加锁】都是当前读,比如for update

Read View 读视图

在事务执行sql 语句读时候产生的读视图,主要作用是判断记录的【可见性】,就是用来判断当前事务可以读取哪个版本的数据。

read view 包含以下几个属性

m_ids:当前系统中存在哪些活跃未提交的事务id,是一个列表

min_limit_id:在生成当前read view的时候,当前活跃事务中最小的事务id,就是m_ids中的最小值。

max_limit_id:在生成当前read view的时候,系统应该分配给下个事务的id

creator_trx_id:创建当前read view的事务id

判断规则:

  1. trx_id < min_limit_id 可见
  2. trx_id>=max_limit_id 不可见
  3. min_limit_id<=trx_id<max_limit_id
    1. 在m_ids范围内,需要等于creator_trx_id 可见
    2. 不在m_ids范围内,可见

MVCC原理

查询记录的流程

  1. 获取事务版本号,生成read view
  2. 查询数据,并且和read view 中的事务版本进行比较
  3. 如果不符合read view中的可见性规则,就需要去undo log中查询历史快照(根据版本链逐级向上递推)
  4. 最后返回符合要求的数据

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

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

相关文章

java-day11

1.ArrayList 集合和数组的优势对比&#xff1a; 长度可变添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 1.1 ArrayList类概述 什么是集合 ​ 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以发生改变 ArrayList集合的特点 ​ 长度可以变化…

Canal 和 MySQL 配置指南

1. 环境依赖 在开始配置之前&#xff0c;请确保已安装并配置以下环境&#xff1a; Docker&#xff1a;用于运行 MySQL 和 Canal 的容器化服务。 MySQL&#xff1a;确保安装的是支持 binlog 的版本。 Canal&#xff1a;阿里巴巴开源的数据库增量订阅和消费组件。 2. MySQL …

基于ESP32的灌溉系统

精准灌溉优化与高效水资源利用&#xff1a;基于IoT的农业解决方案 引言 传统农业实践缺乏实时监控和高效操作&#xff0c;导致效率低下和产量不高。本项目旨在利用物联网&#xff08;IoT&#xff09;技术和低成本通信协议&#xff0c;设计一个解决方案来解决这一问题。提出的…

C++算法练习-day1——704.二分查找

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始&#xff0c;如果中间元素正好是要查找的元素&#xff0c;则搜索过程结束&#xff1b;如果某一特定元素大…

Linux基础 -- 使用 cgroups 变更进程的CPU亲和性绑核

使用 cgroups 设置 CPU 绑定的教学文档 1. 使用 cgroups 设置 CPU 绑定 在 Linux 中&#xff0c;使用 cgroups 可以对进程进行 CPU 绑定&#xff0c;从而控制它们在哪些 CPU 核心上运行。以下是基本步骤&#xff1a; 创建 cgroup&#xff1a; mkdir /sys/fs/cgroup/cpuset/my…

Docker实践与应用举例

目录 1. 引言 2. Docker的基本概念 2.1 什么是Docker容器 2.2 Docker镜像 2.3 Docker架构 3. Docker的应用场景 3.1 开发与测试环境的隔离 3.2 持续集成与持续交付&#xff08;CI/CD&#xff09; 3.3 微服务架构 4. Docker的实践案例 4.1 部署Nginx反向代理 4.2 使用…

研发线上事故风险解读之缓存篇

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》&#xff0c;进一步深入梳理线上事故缓存使用方面的问题点&#xff0c;重点关注缓存在使用和优化过程中可能出现的问题&#xff0c;旨在为读者提供具有实践指导意义的…

学习如何将Spring Boot Jar包注册成Windows服务

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在开发Spring Boot应用时&#xff0c;我们通常通过命令行或IDE手动启动项目。然而&#xff0c;在生产环境中&#xff0c;为了提升效率和稳定性&#xff0c;我们更希望应用能够自动启动&#xff0c;并且作为Wi…

OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条&#xff08;trackbar&#xff09;的当前…

【H2O2|全栈】JS入门知识(二)

目录 JS 前言 准备工作 运算符 算数运算符 比较运算符 自增、自减运算符 逻辑运算符 运算符的优先级 分支语句 if-else语句 switch语句 三元表达式 结束语 JS 前言 本系列博客主要分享JavaScript的基础语法知识&#xff0c;本期为第二期&#xff0c;包含一些简…

Linux基础命令系列一小白必掌握

前言 为了有一个大概的复习框架所以先给出总的思维导图&#xff0c;如图&#xff1a; 目录 1.Linux的目录结构&#xff1f;Linux命令与命令行是什么&#xff1f;Linux命令基础格式&#xff1f; 2.ls命令 3.cd命令 4.mkdir命令 5.touch命令 6.cat命令 7.cp命令 8.mv命令…

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…

PLM预训练语言模型Pre-trained Language Model

预训练语言模型&#xff08;Pre-trained Language Model&#xff0c;PLM&#xff09; gpt就是一个典型的例子 一、PLM 的定义与概念 预训练语言模型是一种在大规模文本数据上进行无监督学习得到的语言模型。它通过学习语言的统计规律、语法结构和语义表示&#xff0c;为各种自…

模板方法模式、策略模式(C++)

模板方法模式&#xff1a; 定义&#xff1a;定义一个操作算法的框架&#xff0c;实现步骤延迟到子类中去实现 策略模式&#xff1a; 定义&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。该模式使得算法可独立于使用它的客户…

开源GenImage的图片检测工具使用指南

引言 GenImage是一款开源的图片检测工具&#xff0c;旨在帮助用户在各种应用场景中进行图像处理和分析。该工具具有灵活性、可扩展性和高效性&#xff0c;适合从事计算机视觉、图像处理和深度学习的研究人员和开发者使用。本文将详细介绍如何安装、配置和使用GenImage进行图片…

深入剖析递归算法:原理、特点、应用与优化策略

在上一篇文章&#x1f449;【剖析十大经典二叉树题目】中&#xff0c;运用到了大量的递归算法&#xff0c;故本文将解析递归算法。 目录 &#x1f4af;引言 &#x1f4af;递归算法的定义与原理 ⭐定义 ⭐原理 &#x1f4af;递归算法的特点 ⭐简洁性 ⭐可读性 ⭐通用性 …

linux下编译鸿蒙版boost库

我在上一篇文章中介绍了curl和openssl的编译方式&#xff08;linux下编译鸿蒙版curl、openssl-CSDN博客&#xff09;&#xff0c;这篇再介绍一下boost库的编译。 一.环境准备 1.鸿蒙NDK 下载安装方式可以参考上篇文章&#xff0c;完毕后NDK的路径为&#xff1a;/home/ubuntu…

Java学习Day47:戏耍黑手道人(项目记录)

1.项目背景 2.技术选择 3.环境搭建 1.创建空项目 创建health_parent父文件用来控制依赖&#xff0c;类型为quickStart 打包方式为&#xff0c;pom&#xff1a;用在父级工程或聚合工程中&#xff0c;用来做jar包的版本控制&#xff0c;必须指明这个聚合工程的打包方式为pom。…

信息抽取数据集处理——RAMS

引言 RAMS数据集&#xff08;RAMS&#xff1a;Richly Annotated Multilingual Schema-guided Event Structure&#xff09;由约翰斯霍普金斯大学于2020年发布&#xff0c;是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件&#xff0c;涵盖了139种不同的事件类型和65种…

服务端技术架构演进之路

服务端技术架构演进之路 目录 服务端技术架构演进之路 0.架构中常见概念及理解 1.单机架构 2.应用数据分离架构 3.应用服务器集群架构 4.读写分离/主从分离架构 5.冷热分离架构 6.垂直分库架构 7.微服务架构 8.容器编排架构 本文以一个 " 电子商务 " 应…