MySQL优化--MVCC

news2024/11/27 13:47:43

目录

概念

MVCC的具体实现

隐式字段

undo log日志

概念

undo log版本链

readview


接上文,redo log保证了事务的持久性,undo log 保证了事务的原子性和一致性

那,隔离性是如何保证的呢?

锁:排他锁(如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁

mvcc : 多版本并发控制

概念

全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突

mvcc最主要的功能就是在多个事务并发的情况下,确定应该并发的访问哪个版本

MVCC的具体实现

主要依赖于数据库记录中的隐式字段undo log日志readView

隐式字段

 

 我们在表中自定义了id,age,name字段,但其实内部还隐藏了三个mysql提供的字段

隐藏字段

含义

DB_TRX_ID

最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID

DB_ROLL_PTR

回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。

DB_ROW_ID

隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

undo log日志

概念

回滚日志,在insertupdatedelete的时候产生的便于数据回滚的日志

insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除

updatedelete的时候,产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除

undo log版本链

假如此时同时有四个事务同时操作。

先来看事务2,此时会先把原来的数据记录到日志中

 事务3,此时会重新记录旧数据

 

事务4也是同理,综上所述,我们可以知道:不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

但是,问题来了?事务5呢,事务5进行了两次查询,两次查询返回的内容一样吗?执行的结果一样吗?这个就不是undo log版本链可以决定的了,他只是做一个记录,具体的判断依据就是readview 

readview

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

当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select ... lock in share mode(共享锁)select ... for updateupdateinsertdelete(排他锁)都是一种当前读。

快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据不加锁,是非阻塞读。

而这个也与隔离级别有关

Read Committed:每次select,都生成一个快照读。

Repeatable Read:开启事务后第一个select语句才是快照读的地方。

四大核心字段:

字段

含义

m_ids

当前活跃的事务ID集合

min_trx_id

最小活跃事务ID

max_trx_id

预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)

creator_trx_id

ReadView创建者的事务ID

 以图中标红位置为例,当执行到红框位置时,

m_ids就是事务3,事务4,事务5

min_trx_id就是事务3

max_trx_id就是事务6(预分配事务,最大事务+1

creator_trx_id就是事务5

其中,ReadView为了能获取快照读中最准确的数据,它定义了一些数据访问的规则

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

READ COMMITTED :在事务中每一次执行快照读时生成ReadView

RC隔离级别下,在事务中每一次执行快照读时生成ReadView。

REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView

面试回答

面试官:事务中的隔离性是如何保证的呢?(你解释一下MVCC)

候选人:事务的隔离性是由锁和mvcc实现的。 其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写 操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段, 第二个是undo log日志,第三个是readView读视图。

隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事 务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回 滚指针),指向上一个版本的事务版本记录地址

undo log主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个 版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本, 通过roll_pointer指针形成一个链表

readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规 则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读 是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快 照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生 成ReadView,后续复用

 

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

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

相关文章

Linux下Redis 存储

命令使用 目录 命令使用 RDB持久化 AOF持久化 yum安装 [rootlocalhost ~]# yum -y install redis 已加载插件:fastestmirror Loading mirror speeds from cached hostfile* c7-media: * epel: ftp.yz.yamagata-u.ac.jpvim到文件etc/redis.conf 取消注释requirep…

Paddle lite 初识与简单使用

一、何为Paddle lite 官方解释如下: Paddle Lite是飞桨基于Paddle Mobile全新升级推出的端侧推理引擎,在多硬件、多平台以及硬件混合调度的支持上更加完备,为包括手机在内的端侧场景的AI应用提供高效轻量的推理能力,有效解决手机…

Android——事务处理(十二)

1. 事件处理简介 1.1 知识点 (1)了解事件处理的作用; (2)了解常用的事件及相关处理接口; 1.2 具体内容 在android当中,基本上每一个组件都有用相应的事件处理,但是不过有多少种事…

chatgpt赋能python:Python抢单软件:如何优化SEO?

Python抢单软件:如何优化SEO? 导言 随着互联网技术的飞速发展,越来越多的人开始关注SEO(Search Engine Optimization)技术。而对于Python编程工程师来说,了解SEO技术也是非常重要的。那么,如何…

day10 伪操作与混合编程

伪操作 伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译 .global symbol 将symbol声明成全局符号.local symbol 将symbol声明成局部符号.equ DATA, 0xFFMOV R1, #DATA.macro FUNCMOV R1, #1MOV R2, #2.endmFUNC.if 0MOV R1, #1MOV R2, #2.endif…

简要介绍 | 快速傅里叶变换:从原理到应用

注1:本文系“简要介绍”系列之一,仅从概念上对快速傅里叶变换进行非常简要的介绍,不适合用于深入和详细的了解。 快速傅里叶变换:从原理到应用 Denoising Data with Fast Fourier Transform 1. 背景介绍 傅里叶变换(F…

vcruntime140_1.dll修复,vcruntime140_1.dll丢失推荐的修复方法-一键修复

vcruntime140_1.dll是什么什么文件呢?为什么电脑在运行一些游戏的时候会出现丢失vcruntime140_1.dll,然后游戏运行失败?这个dll文件是电脑重要的运行库文件。丢失了会导致很多程序无法运行。 本教程操作系统:Windows vcruntime140_1.dll丢失…

第十四章 json模块

1. json模块介绍 Python 中的json 模块提供了对JSON 的支持,用于将JSON 格式字符串转换为Python 对象。首先需要了解一下什么是JSON。 什么是JSON JSON 是基于JavaScript 语言的轻量级的数据交换格式,是JavaScript 对象的表示法(JavaScrip…

mariadb 高可用集群

目录 1.相同操作:修改hosts文件 把四台机IP写进去 2. www 管理机 4.管理 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于…

C51/C52--LCD1602

目录 一、LCD1602简介 二、LCD1602的工作(显示)原理 三、技术参数 四、外形参数,引脚功能 五、连接方式 六、示例程序与结果 一、LCD1602简介 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏&#xff0…

chatgpt赋能python:如何使用Python找出重复元素

如何使用Python找出重复元素 在Python编程中,有时候需要查找并删除重复的元素。这些元素可以是列表、字符串等数据类型。在本文中,将介绍如何使用Python查找并删除重复元素。以下是我们将要涉及到的一些主题: 为什么需要查找重复元素&#…

深挖面试题讲解

面试题讲解🍴 文章目录 面试题讲解🍴和equals()的区别🍔1️⃣注意事项2️⃣明确问题3️⃣总结 什么是HashCode🍇1️⃣HashCode的描述2️⃣常见误区3️⃣hashCode的作用4️⃣总结 String、StringBuffer、StringBuilder的区别&#…

chatgpt赋能python:Python编程:如何找出给定的n个数中的最大值及其对应的最小下标

Python编程:如何找出给定的n个数中的最大值及其对应的最小下标 当需要在一组数字中找到最大值时,Python提供了内置函数 max() 。 但是,如果我们需要找出最大值的同时还需要找出其最小下标,该怎么办呢? 在本文中&#…

初始化命令

创建项目 vue2 vue3 create demo vue3 vue3 create demo vue2 webpack vue2 init webpack demo vue3 vite yarn create vite demo --template vue sass cnpm下载 --save-dev -D 开发环境 --save -S 生产环境 cnpm i node-sass4.14.1 sass-loader7.3.1 --save-…

[架构之路-215]- 架构 - 概念架构 - 模块(Module)、组件(Component)、包(Package)、对象、函数的区别

前言: 在软件架构中,一个重要的任务就是切分系统,而切分系统进程涉及到一个基本的概念,如模块(Module)、组件(Component)、包(Package)、对象,本…

管理类联考——写作——技巧篇——论证有效性——谬误概念汇总简释

批判性思维常见逻辑谬误 有些错误出现在我们澄清或定义某个观点的时候,有些错误出现在我们收集证据或者用证据和理由支撑某个观点的时候,有些错误出现在我们尝试从证据得出结论的时候,有些错误甚至出现在我们评估他人的观点或者理由的时候。…

美味度配方

8 种配料每种配料可以放 1 到 5 克,美味度为配料质量之和,给定一个美味度 n,求解 8 种配料的所有搭配方案及方案数量 。 (本笔记适合学了 Python 循环,正在熟炼的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a…

chatgpt赋能python:把图像放在中间的SEO优化指南

把图像放在中间的SEO优化指南 当我们在设计网站或博客时,经常会使用图像来增加文章的吸引力和清晰度。但是,图像的位置对于搜索引擎优化(SEO)很重要,因为搜索引擎无法理解和索引图像的内容,所以我们需要通…

chatgpt赋能python:Python抢商品:自动化实现秒杀购物的利器

Python抢商品:自动化实现秒杀购物的利器 随着互联网和电商的高度融合,电商平台受到越来越多的用户关注和青睐。在线购物已成为人们日常生活中必不可少的一部分,不管是网购小白还是技术大牛,都喜欢在各种平台上刷到想要的商品。但…

chatgpt赋能python:让Python帮助你轻松抢券

让Python帮助你轻松抢券 在这个数字化时代,抢购已成为电商平台上最为火热的活动之一。限时抢购、秒杀活动、优惠券折扣等等,都吸引了大量消费者的关注。然而,随着购物热潮的兴起,商品的库存有限,抢购难度越来越大。在…