MySQL的多版本并发控制(MVCC)

MVCC

MVCC,是Multiversion Concurrency Control的缩写,翻译过来是多版本并发控制,和数据库锁样,他也是一种并发控制的解决方案

我们知道,在数据库中,对数据的操作主要有2种,分别是读和写,而在并发场景下,就可能出现以下 旦三种情况:读-读并发,读-写并发,写-写并发
我们都知道,在没有写的情况下读-读并发是不会出现问题的,而写-写并发这种情况比较常用的就是通过加锁的方式实现。那么,读-写并发则可以通过MVCC的机制解决

快照读和当前读

快照读:就是读取的快照数据,即快照生成的那一刻的数据,像我们常用的普通的SELECT语句在不加锁的情况下就是快照读

如:select *  from table_name  where xxx;

当前读:当前读就是读取最新数据,加锁的select,或者对数据进行增删改都会进行当前读,

如:SELECT *FROM xx_table LOCK IN SHARE MODE;

SELECT *FROM xx_table FOR UPDATE;

INSERT INTO xx_table ...;DELETE FROM xx_table ...;UPDATE xx_table ...;

在mysql中只有已提交读和重复读两种事物隔离级别才会使用快照读

Undolog

undo log是Mysql中比较重要的事务日志之一,顾名思义,undo log是一种用于回退的日志,在事务没提交之前,MySQL会先记录更新前的数据到 undo log日志文件里面,当事务回滚时或者数据库崩溃时,可以利用 undo log来进行回退。
这里面提到的存在undo log中的"更新前的数据”就是我们前面提到的快照。所以,这也是为什么很多人说UndoLog是MVCC实现的重要手段的原因。
那么,一条记录在同一时刻可能有多个事务在执行,那么,undo log会有一条记录的多个快照,那么在这一时刻发生SELECT要进行快照读的时候,要读哪个快照呢?
这就需要用到另外几个信息了

行记录的隐式字段

数据库中除了自己定义的字段外,还有一些重要的隐式字段

  • db_row_id:隐藏的行 ID,用来生成默认聚集索引。如果我们创建数据表的时候没有指定聚集索引,这时 InnoDB 就会用这个隐藏 ID 来创建聚集索引。采用聚集索引的方式可以提升数据的查找效率。
  • db_trx_id:操作这个数据的事务 ID,也就是最后一个对该数据进行插入或更新的事务 ID。
  • db_roll_ptr:回滚指针,也就是指向这个记录的 Undo Log 信息

因为每一次修改之前都会先存储一份快照到undo log中,那么这几个隐式字段一会一起保存到undo log中,就这样,每一个快照中都有一个db_trx_id 事物id字段表示了对这条记录最新一次修改的事物ID,以及一个回滚指针指向上一个快照地址

Read View

有了undo log,又有了几个隐式字段,我们好像还是不知道具体应该读取哪个快照,那怎么办呐

这就需要用到read View

read view 主要来帮我们解决可见性问题的,即他会来告诉我们应该看到哪个快照,不应该看到哪些快照

在 Read View 中有几个重要的属性:

  • trx ids,系统当前未提交的事务 ID 的列表
  • low limit id,应该分配给下一个事务的id 值
  • up limit id,未提交的事务中最小的事务 ID
  • creator trx id,创建这个 Read View 的事务ID

其实原值比较简单:那就是事物ID大的事务应该能看到事务ID小的事物的变更结果,反之则不能

所以,总结一下,

在InnoDB中,MVCC就是通过Read View + Undo Log来实现的,undo log中保存了历史快照,r而Read View用来判断具体哪一个快照是可见的。

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

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

相关文章

MetaGPT学习笔记 - task1task2

章节:task1&task2 一.github地址:github.com/geekan/MetaGPT 二.MetaGPT: 多智能体框架​ 使 GPT 以软件公司的形式工作,协作处理更复杂的任务 MetaGPT输入一句话的老板需求,输出用户故事 / 竞品分析 / 需求 / 数据结构 / A…

1115: 数组最小值(数组)

题目描述 数组a有n个元素&#xff0c;请输出n个元素的最小值及其下标。若最小值有多个&#xff0c;请输出下标最小的一个。注意&#xff0c;有效下标从0开始。 输入 输入分两行&#xff0c;第一行是一个正整数n&#xff08;n<1000)&#xff0c;第二行是n个整数。 输出 …

出现 SyntaxError: future feature annotations is not defined 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行sql语句的时候,出现如下问题,问题如下所示: E:\software\anaconda3\envs\py3.6\python.exe F:\python_project\test\sql_connect.py Traceback (most recent call last):File "F:\python_project\test\sql_c…

机器学习之Ridge回归与Lasso回归

Ridge回归与Lasso回归是什么 Ridge回归和Lasso回归是机器学习中常用的线性回归算法的变种。 Ridge回归是一种线性回归算法&#xff0c;通过在损失函数中添加一个正则化项&#xff0c;以控制模型的复杂度。正则化项是模型参数的平方和与一个参数alpha的乘积&#xff0c;alpha越…

行程长度编码

前言 NWAFU 2023阶段二 A 一、题目描述 题目描述 “行程长度编码&#xff08;Run-Length Encoding&#xff0c;RLE&#xff09;”是一种无损压缩编码方法&#xff0c;其核心思想是依次记录符号序列中的每个字符&#xff08;忽略大小写&#xff09;及其重复出现的次数。例如用…

Makefile编译原理 变量的使用

一.变量和不同的赋值方法 ->makefile中支持程序设计语言中变量的概念 ->makefile中的变量只代表文本数据&#xff08;字符串&#xff09; ->makefile中的变量名规则 - 变量名可以包含字符&#xff0c;数字&#xff0c;下划线。 - 不能包含 ":" "#&…

C++重点简答题

文章目录&#xff08;持续更新&#xff09; C重点简答题&#x1f4e3;一、什么是静态变量&#xff1f;&#x1f4e3;二、谈谈你对顺序文件的认识&#xff1f;&#x1f4e3;三、什么是局部变量&#xff1f;什么是全局变量&#xff1f;二者的区别&#xff1f;&#x1f4e3;四、谈…

你好2024,OpenStreetMap 20 周岁

2004年&#xff0c;OpenStreetMap在英国诞生。2024年&#xff0c;OpenStreetMap 满 20 周岁&#xff0c;其愿景是创建一个免费的、可编辑的世界地图。当时&#xff0c;地图数据的获取往往受到限制或价格昂贵1。 经过20年的发展&#xff0c;该数据集合成为了最为全面的街道级别开…

宿舍维修管理系统:从数据库到前端的全面解析

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

[openGL]在ubuntu20.06上搭建openGL环境

就在刚刚, 我跑上了一个6小时后出结果的测试程序. 离下班还有很久, 于是我打开了接单群 , 发现了很多可以写的openGL项目. 但是!!我的电脑现在是ubuntu呀, 但是不要慌!!!接下来我一步一步教你如何完美搭建一个ubuntu上的openGL环境. 保证一个坑也不会踩! 文章目录 创建项目工作…

《Git学习笔记:IDEA整合Git》

在IDEA中集成Git去使用 通过Git命令可以完成Git相关操作&#xff0c;为了简化操作过程&#xff0c;我们可以在IDEA中配置Git&#xff0c;配置好后就可以在IDEA中通过图形化的方式来操作Git。 在IDEA开发工具中可以集成Git&#xff1a; 集成后在IDEA中可以看到Git相关图标&…

React16源码: React中调度之batchedUpdates的源码实现

batchedUpdates 1 &#xff09;概述 在 requestWork 在中间, 会判断一个 isBatchingUpdates 做一些特定的操作batchedUpdates 是一个批量更新的操作, 什么是批量更新呢&#xff1f;先来看一个例子 2 &#xff09;示例 index.js import React from react import ReactDOM fr…

【MySQL】mysql集群

文章目录 一、mysql日志错误日志查询日志二进制日志慢查询日志redo log和undo log 二、mysql集群主从复制原理介绍配置命令 读写分离原理介绍配置命令 三、mysql分库分表垂直拆分水平拆分 一、mysql日志 MySQL日志 是记录 MySQL 数据库系统运行过程中不同事件和操作的信息的文件…

二级C语言备考6

一、单选 共40题 &#xff08;共计40分&#xff09; 第1题 &#xff08;1.0分&#xff09; 题号:6675 难度:易 第1章 以下选项中叙述正确的是 A:C程序中的语句要经过编译才能转换成二进制机器指令 B:算法需要包含所有三种基本结构 C:有些算法不能用…

Mac M1 Parallels CentOS7.9 Rancher + K8S + Gitlab + Jenkins +Harbor CICD

一、资源清单 机器名称IP地址角色k8srancher高可用部署: https://blog.csdn.net/qq_41594280/article/details/135312148rancher10.211.55.200管理K8S集群k8svip10.211.55.199K8S VIPmaster0110.211.55.201K8S集群主节点master0210.211.55.202K8S集群主节点master0310.211.55.…

华为机试真题实战应用【赛题代码篇】-分苹果(附Java、C++和python代码)

目录 题目描述 解析思路 思路1 思路2 代码实现 Java 代码2

redis数据结构源码分析——跳表zset

文章目录 跳表的基本思想特点节点与结构跳跃表节点zskiplistNode属性 跳跃表链表属性 跳表的设计思想和优势API解析zslCreate&#xff08;创建跳跃表&#xff09;zslCreateNode&#xff08;创建节点&#xff09;zslGetRank&#xff08;查找排位&#xff09;zslDelete&#xff0…

Tiktok/抖音旋转验证码识别

一、引言 在数字世界的飞速发展中&#xff0c;安全防护成为了一个不容忽视的课题。Tiktok/抖音&#xff0c;作为全球最大的短视频平台之一&#xff0c;每天都有数以亿计的用户活跃在其平台上。为了保护用户的账号安全&#xff0c;Tiktok/抖音引入了一种名为“旋转验证码”的安…

flex布局之美,以后就靠它来布局了

写在前面 在很久很久以前&#xff0c;网页布局基本上通过table 元素来实现。通过操作table 中单元格的align 和valign可以实现水平垂直居中等 再后来&#xff0c;由于CSS 不断完善&#xff0c;便演变出了&#xff1a;标准文档流、浮动布局和定位布局 3种布局 来实现水平垂直居…

恒源云GPU服务器使用Linux图形化界面

编程如画&#xff0c;我是panda&#xff01; 干货满满&#xff0c;不要走开~ 前言 前一节分享了如何在GPU云服务器上创建实例并运行YOLOV5项目&#xff0c;但是使用命令行的方式容易劝退很多小白&#xff0c;并且有些环境配置是需要图形化界面的&#xff0c;所以这一节就教大家…