MVCC实现原理以及解决脏读、不可重复读、幻读问题
MVCC实现原理以及解决脏读、不可重复读、幻读问题
- MVCC是什么?有什么作用?
- MVCC的实现原理
- 行隐藏的字段
- undo log日志
- 版本链
- Read View
- MVCC在RC下避免脏读
- MVCC在RC造成不可重复读、丢失修改
- MVCC在RR下解决不可重复读问题
- RR下仍然存在幻读的问题
MVCC是什么?有什么作用?
MVCC即多版本并发控制,每行数据存在多个事务版本,通过对数据多个版本的访问可以使读操作不会阻塞写操作,写操作不会阻塞读操作。我们所使用的mysql,其默认引擎为inndb,就支持MVCC,使用MVCC来提高mysql读写的性能。
MVCC的实现原理
MVCC通过行隐藏的字段、undo log日志以及Read View 来实现。
行隐藏的字段
每一行数据含有三个字段,分别是row_id、trx_id和roll_pointer。
row_id:行ID,当存在主键和非空唯一键时默认为row_id,如果不存在,则每一行数据隐藏了行ID
trx_id:事务id,即数据对应的事务版本号。
roll_pointer:回滚指针,指向undo log日志中的数据
undo log日志
mysql我们直到其存在三大日志,分别时binlog、undo log、redo log。
undo log日志会在事务执行之前记录数据的信息,当事务执行发生错误需要进行回滚时,会通过undo log日志将数据回滚到执行之前的数据。
版本链
当多个事务对数据进行修改时,会通过行隐藏的回滚指针和undo log日志形成一条版本链。版本链从最新数据的回滚指针指向undo log日志中的历史数据版本,然后相连形成一条版本链。
Read View
我们上面介绍了行隐藏的字段和undo log日志,多个事务可以从版本链中读取想要的数据版本信息,那么每个事务是怎么找到它们想要的版本呢?或者换一种说法它们怎么找到当前事务可见的数据版本呢?
通过Read View实现,当事务执行时进行一次快照读也即普通查询时,会生成一个Read View视图,在版本链中查找数据后,会通过Read View内部的算法来判断是否对当前事务可见,如果不可见,会在版本链中继续遍历。
Read View实现属性:当生成Read View时,会包含以下属性。
m_ids:当前系统活跃(未提交)的事务id集合
min_limit_id:m_ids中最小的事务id,即最小未提交的事务id
max_limit_id:将要生成的事务id,由于事务id递增生成,因此将要生成的事务id对当前事务是不可见的
creator_trx_id:当前事务id
Read View判断可见性算法:
对于一个事务trx_id,由Read View内部算法判断是否可见,如下:
1、如果trx_id < min_limit_id,由于事务id是递增的,而事务id小于最小未提交的事务,说明该事务已经提交,对当前事务是可见的。
2、如果trx_id >= max_limit_id,说明该事务版本是在当前事务生成Read View视图之后执行的,对当前事务是不可见的。
3、如果min_limit_id <= trx_id < max_limit_id,进行以下的判断:
@1:如果m_ids中包含trx_id,并且trx_id !=creator_trx_id,说明该事务是当前事务生成Read View视图时未提交的事务,并且不是当前事务,对当前事务是不可见的。
@2:如果m_ids中包含trx_id,并且trx_id ==creator_trx_id,说明该事务是当前事务生成Read View视图时未提交的事务,但是该事务是当前事务,因此是可见的。
@3:如果m_ids中不包含trx_id,说明该事务已经提交,对当前事务是可见的。
MVCC在RC下避免脏读
当事务101开启后,修改了id=1的数据后会生成一条事务id=101的数据版本
当事务102开始执行时,进行一次快照读,会生成Read View视图,事务101此时还未提交,生成的视图如下:
此时在版本链中先找到了事务id=101的数据,由于m_ids包含101并且101 != 102,所以事务id为101的数据对当前事务不可见。
再次遍历找到事务id=100的数据,由于100 < 101,所以事务id=100的数据对当前事务是可见的,因此避免了脏读的问题
MVCC在RC造成不可重复读、丢失修改
对于上图执行的顺序,由于在RC每进行一次快照读都会生成一个Read View。
第一次查询数据时:
生成视图:
由于100 < 101,对当前事务可见,读取了事务id=100的数据。
当进行第二次查询时:
生成视图:
由于事务102修改数据,生成事务id=102的数据版本。
当遍历事务id=102的数据版本时,由于 101 <= 102 <103并且m_ids中不包含102,因此事务id=102的数据版本对当亲事务可见,读取了事务id=102的数据。
由于事务的多次查询结果不一样,导致了不可重复读的问题。
MVCC在RR下解决不可重复读问题
在RR隔离级别下,每个事务只能生成一个Read View,就可以保证一个事务中进行多次查询时使用的是同一个视图,就保证了查询的数据相同,解决了不可重复读的问题,
同MVCC解决不可重复读问题一样,MVCC解决了幻读的问题,但是并没有完全解决,还存在一些问题。
RR下仍然存在幻读的问题
如上图,事务102插入了id=10的数据,由于Read View事务101本来是对事务102插入的数据是不可见的,但是由于事务101对插入的数据进行了修改,而当前修改的数据对当前事务是可见的,就导致了事务101读取了新插入的数据,造成了脏读的问题,但是在业务中发生这种情况的概率相当低
相关文章:
MVCC实现原理以及解决脏读、不可重复读、幻读问题
MVCC实现原理以及解决脏读、不可重复读、幻读问题 MVCC是什么?有什么作用?MVCC的实现原理行隐藏的字段undo log日志版本链Read View MVCC在RC下避免脏读MVCC在RC造成不可重复读、丢失修改MVCC在RR下解决不可重复读问题RR下仍然存在幻读的问题 MVCC是什么…...
PilotGo
title: 解锁 PilotGo:智能化运维的得力助手 date: ‘2024-12-29’ category: blog tags: PilotGo运维管理智能化工具技术应用 sig: ops archives: ‘2024-12’ author:way_back summary: PilotGo 作为一款创新的运维管理工具,凭借其智能化的特性和丰富的…...
【后端】LNMP环境搭建
长期更新各种好文,建议关注收藏! 本文近期更新完毕。 LNMPlinuxnginxmysqlphp 需要的资源 linux服务器 web服务软件nginx 对应的语言编译器代码文件 数据库mysql安装 tar.gz包或者命令行安装 进入root: sodu 或su mkdir path/{server,soft}…...
vue 本地自测iframe通讯
使用 postMessage API 来实现跨窗口(跨域)的消息传递。postMessage 允许你安全地发送消息到其他窗口,包括嵌套的 iframe,而不需要担心同源策略的问题。 发送消息(父应用) 1. 父应用:发送消息给…...
【人工智能】基于Python和OpenCV实现实时人脸识别系统:从基础到应用
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能和计算机视觉的快速发展,人脸识别技术已广泛应用于监控、安全、社交媒体、金融和医疗等领域。本文将介绍如何利用Python和Ope…...
vue2使用pdfjs-dist和jsPDF生成pdf文件
vue2使用pdfjs-dist和jsPDF生成pdf文件 1、安装依赖 npm install pdfjs-dist2.6.3472、引入依赖 import { jsPDF } from jspdf// 使用require方式导入pdfjs-dist v2.6.347,高版本报错(import导入会报错:GlobalWorkerOptions undefined&…...
深度学习算法选择
1. 卷积神经网络(Convolutional Neural Networks, CNNs) 简介 卷积神经网络擅长处理具有网格结构的数据,如图像。通过卷积层、池化层和全连接层,CNN能够自动提取和学习数据的空间特征。 应用场景 图像识别与分类:如…...
asp.net core系统记录当前在线人数
实时记录当前在线人数,登录后保持120秒在线状态,在线状态保存在缓存中,采用滑动过期,在120秒内请求了系统,自动续活120秒;超过时间则移除用户在线状态; 需要在登录过滤器标记用户在线状态需要排…...
【每日学点鸿蒙知识】Grid子项拖动、Swiper指示器、手势事件上报、指定使用发布版本API、打包签名失败报错109
1、HarmonyOS Grid组件子项拖动问题? Grid组件中有20个GridItem子组件,其中前4个GridItem是不能拖动的,其余GridItem可拖动排序。 关于可拖拽grid及gridItem可参考如下代码(注:其中 .draggable(parseInt(day) < 6…...
轻松实现向量搜索:探索 Elastic-Embedding-Searcher 项目
随着人工智能和机器学习技术的飞速发展,向量搜索已成为数据检索的重要方式。尤其是在处理大规模文本数据时,传统的基于关键词的检索方式已经难以满足需求。为了优化检索性能并提升搜索精度,向量搜索成为了更加高效的解决方案。而在这一领域&a…...
区块链平台安全属性解释
区块链平台安全属性解释 双向认证 解释:双向认证是指在通信过程中,**通信双方都需要对对方的身份进行验证,确保对方是合法的、可信任的实体。**只有双方身份都得到确认后,通信才会被允许进行,从而防止非法用户的接入和数据的窃取或篡改。举例:在基于区块链和联邦学习的数…...
matlab reshape permute
1.reshape 将向量按照顺序重新构建 矩阵,新矩阵 先排完第一列, 再第二列… 2.permute 将向量 维度变换...
《一文读懂卷积网络CNN:原理、模型与应用全解析》
《一文读懂卷积网络CNN:原理、模型与应用全解析》 一、CNN 基本原理大揭秘(一)从人类视觉到 CNN 灵感(二)核心组件详解 二、经典 CNN 模型巡礼(一)LeNet-5:开山鼻祖(二&a…...
深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 (中英双语)
深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 在深度学习模型的实现中,view() 是 PyTorch 中一个非常常用的张量操作函数,它能够改变张量的形状(shape)而不改…...
【每日学点鸿蒙知识】获取是否有网接口、获取udid报错、本地通知、Json转Map、Window10安装Hyper-v
1、有没有获取当前是否真实有网的接口? 比如当前链接的是wifi,但是当前wifi是不能访问网络的,有没有接口可以获取到这个真实的网络访问状态? 请参考说明链接:https://developer.huawei.com/consumer/cn/doc/harmonyo…...
《Vue3 四》Vue 的组件化
组件化:将一个页面拆分成一个个小的功能模块,每个功能模块完成自己部分的独立的功能。任何应用都可以被抽象成一棵组件树。 Vue 中的根组件: Vue.createApp() 中传入对象的本质上就是一个组件,称之为根组件(APP 组件…...
Linux:alias别名永久有效
一、背景 日常使用bash时候,有些常用的命令参数的组合命令太长,很难记,此时可以利用Linux提供的alias命令生成命令的别名(命令的隐射),但是我们会发现,当退出了终端后重新登录就失效了ÿ…...
MicroDiffusion——采用新的掩码方法和改进的 Transformer 架构,实现了低预算的扩散模型
介绍 论文地址:https://arxiv.org/abs/2407.15811 现代图像生成模型擅长创建自然、高质量的内容,每年生成的图像超过十亿幅。然而,从头开始训练这些模型极其昂贵和耗时。文本到图像(T2I)扩散模型降低了部分计算成本&a…...
网神SecFox FastJson反序列化RCE漏洞复现(附脚本)
0x01 产品描述: 网神SecFox是奇安信网神信息技术(北京)股份有限公司推出的一款运维安全管理与审计系统,集“身份认证、账户管理、权限控制、运维审计”于一体,提供统一运维身份认证、细粒度的权限控制、丰富的运维审计报告、多维度的预警…...
解决无法在 Ubuntu 24.04 上运行 AppImage 应用
在 Ubuntu 24.04 中运行 AppImage 应用的完整指南 在 Ubuntu 24.04 中,许多用户可能会遇到 AppImage 应用无法启动的问题。即使你已经设置了正确的文件权限,AppImage 仍然拒绝运行。这通常是由于缺少必要的库文件所致。 问题根源:缺少 FUSE…...
Pytorch | 利用PC-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用PC-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集PC-I-FGSM介绍算法原理 PC-I-FGSM代码实现PC-I-FGSM算法实现攻击效果 代码汇总pcifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR…...
前端往后端传递参数的方式有哪些?
文章目录 1. URL 参数1.1. 查询参数(Query Parameters)1.2. 路径参数(Path Parameters) 2. 请求体(Request Body)2.1. JSON 数据2.2. 表单数据2.3. 文件上传 3. 请求头(Headers)3.1. 自定义请求…...
对抗攻击VA-I-FGSM:Adversarial Examples with Virtual Step and Auxiliary Gradients
文章目录 摘要相关定义算法流程代码:文章链接: Improving Transferability of Adversarial Examples with Virtual Step and Auxiliary Gradients 摘要 深度神经网络已被证明容易受到对抗样本的攻击,这些对抗样本通过向良性样本中添加人类难以察觉的扰动来欺骗神经网络。目…...
【Java】IO流练习
IO流练习 题干: 根据指定要求,完成电话记录、 注册、登录 注册 题干: 完成【注册】功能: 要求: 用户输入用户名、密码存入users.txt文件中 若users.txt文件不存在,创建该文件若users.txt文件存在 输入…...
红魔电竞PadPro平板解BL+ROOT权限-KernelSU+LSPosed框架支持
红魔Padpro设备目前官方未开放解锁BL,也阉割了很多解锁BL指令,造成大家都不能自主玩机。此规则从红魔8开始,就一直延续下来,后续的机型大概率也是一样的情况。好在依旧有开发者进行适配研究,目前红魔PadPro平板&#x…...
小程序配置文件 —— 12 全局配置 - pages配置
全局配置 - pages配置 在根目录下的 app.json 文件中有一个 pages 字段,这里我们介绍一下 pages 字段的具体用法; pages 字段:用来指定小程序由哪些页面组成,用来让小程序知道由哪些页面组成以及页面定义在哪个目录,…...
供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇
概述 我们在供应链系统设计-中台系统设计系列(五)- 供应链中台实践概述 中描述了什么是供应链中台,供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解,我会逐一针对中台…...
leetcode 面试经典 150 题:删除有序数组中的重复项
链接删除有序数组中的重复项题序号26题型数组解题方法双指针难度简单熟练度✅✅✅✅✅ 题目 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保…...
Python 中的 lambda 函数和嵌套函数
Python 中的 lambda 函数和嵌套函数 Python 中的 lambda 函数和嵌套函数Python 中的 lambda 函数嵌套函数(内部函数)封装辅助函数闭包和工厂函数 Python 中的 lambda 函数和嵌套函数 Python 中的 lambda 函数 Lambda 函数是基于单行表达式的匿名函数。…...
Android笔试面试题AI答之Android基础(7)
Android入门请看《Android应用开发项目式教程》,视频、源码、答疑,手把手教 文章目录 1.Android开发如何提高App的兼容性?**1. 支持多版本 Android 系统****2. 适配不同屏幕尺寸和分辨率****3. 处理不同硬件配置****4. 适配不同语言和地区**…...
PhPMyadmin-cms漏洞复现
一.通过日志文件拿Shell 打开靶场连接数据库 来到sql中输入 show global variables like %general%; set global general_logon; //⽇志保存状态开启; set global general_log_file D:/phpstudy/phpstudy_pro/WWW/123.php //修改日志保存位置 show global varia…...
HTML-CSS(day01)
W3C标准: W3C( World Wide Web Consortium,万维网联盟) W3C是万维网联盟,这个组成是用来定义标准的。他们规定了一个网页是由三部分组成,分别是: 三个组成部分:(1&…...
【服务器项目部署】⭐️将本地项目部署到服务器!
目录 🍸前言 🍻一、服务器选择 🍹 二、服务器环境部署 2.1 java 环境部署 2.2 mysql 环境部署 🍸三、项目部署 3.1 静态页面调整 3.2 服务器端口开放 3.3 项目部署 🍹四、测试 🍸前言 小伙伴们大家好…...
计算机网络 (14)数字传输系统
一、定义与原理 数字传输系统,顾名思义,是一种将连续变化的模拟信号转换为离散的数字信号,并通过适当的传输媒介进行传递的系统。在数字传输系统中,信息被编码成一系列的二进制数字,即0和1,这些数字序列能够…...
机器学习周报-TCN文献阅读
文章目录 摘要Abstract 1 TCN通用架构1.1 序列建模任务描述1.2 因果卷积(Causal Convolutions)1.3 扩张卷积(Dilated Convolutions)1.4 残差连接(Residual Connections) 2 TCN vs RNN3 TCN缺点4 代码4.1 TC…...
UniApp 页面布局基础
一、UniApp 页面布局简介 在当今的移动应用开发领域,跨平台开发已成为一种主流趋势。UniApp作为一款极具影响力的跨平台开发框架,凭借其“一套代码,多端运行”的特性,为开发者们提供了极大的便利,显著提升了开发效率。…...
最新的强大的文生视频模型Pyramid Flow 论文阅读及复现
《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址:2410.05954https://arxiv.org/pdf/2410.05954 项目地址: jy0205/Pyramid-Flow: 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…...
论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》
Abstract 通过将时间序列编码为数字组成的字符串,我们可以将时间序列预测当做文本中下一个 token预测的框架。通过开发这种方法,我们发现像GPT-3和LLaMA-2这样的大语言模型在下游任务上可以有零样本时间序列外推能力上持平或者超过专门设计的时间序列训…...
STM32文件详解
STM32文件详解 启动文件打开MDK栈空间开辟堆空间开辟中断向量表复位程序对于 weak 的理解对于_main 函数的分析中断程序堆栈初始化系统启动流程 时钟树时钟源时钟配置函数时钟初始化配置函数 启动文件 启动文件的方式 1、初始化堆栈指针 SP _initial_sp 2、初始化程序计数器指…...
【Spring】详解(上)
Spring 框架核心原理与应用(上) 一、Spring 框架概述 (一)诞生背景 随着 Java 应用程序规模的不断扩大以及复杂度的日益提升,传统的 Java开发方式在对象管理、代码耦合度等方面面临诸多挑战。例如,对象之…...
大数据面试笔试宝典之Flink面试
1.Flink 是如何支持批流一体的? F link 通过一个底层引擎同时支持流处理和批处理. 在流处理引擎之上,F link 有以下机制: 1)检查点机制和状态机制:用于实现容错、有状态的处理; 2)水印机制:用于实现事件时钟; 3)窗口和触发器:用于限制计算范围,并定义呈现结果的…...
Rust编程与项目实战-箱
【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 对于Rust而言,箱(crate)是一个独立的可编译单元&…...
git回退指定版本/复制提交id
1.使用“git reset --hard 目标版本号”命令将版本回退2.使用“git push -f”提交更改 因为我们回退后的本地库HEAD指向的版本比远程库的要旧,此时如果用“git push”会报错。 改为使用 git push -f 即可完成回退后的提交。...
数据库锁的深入探讨
数据库锁(Database Lock)是多用户环境中用于保证数据一致性和隔离性的机制。随着数据库系统的发展,特别是在高并发的场景下,锁的机制变得尤为重要。通过使用锁,数据库能够防止并发操作导致的数据冲突或不一致。本文将深…...
《机器学习》——KNN算法
文章目录 KNN算法简介KNN算法——sklearnsklearn是什么?sklearn 安装sklearn 用法 KNN算法 ——距离公式KNN算法——实例分类问题完整代码——分类问题 回归问题完整代码 ——回归问题 KNN算法简介 一、KNN介绍 全称是k-nearest neighbors,通过寻找k个距…...
iOS开发代码块-OC版
iOS开发代码块-OC版 资源分享资源使用详情Xcode自带代码块自定义代码块 资源分享 自提: 通过网盘分享的文件:CodeSnippets 2.zip 链接: https://pan.baidu.com/s/1Yh8q9PbyeNpuYpasG4IiVg?pwddn1i 提取码: dn1i Xcode中的代码片段默认放在下面的目录中…...
关于在M系列的Mac中使用SoftEtherClient软件
1. 前言 本文说明的是在M系列的苹果的MacBook中如何使用SoftetherClient这款软件,是直接在MacOS操作系统中安装连接使用,不是在PD环境或者非ARM架构的Mac中安装使用。 PS:别费劲百度了,很少有相关解决方案的,在国内会…...
【畅购商城】详情页模块之评论
目录 接口 分析 后端实现:JavaBean 后端实现 前端实现 接口 GET http://localhost:10010/web-service/comments/spu/2?current1&size2 { "code": 20000, "message": "查询成功", "data": { "impressions&q…...
机器学习DAY4续:梯度提升与 XGBoost (完)
本文将通过 XGBoost 框架来实现回归、分类和排序任务,帮助理解和掌握使用 XGBoost 解决实际问题的能力。我们将从基本的数据处理开始,逐步深入到模型训练、评估以及预测。最后,将模型进行保存和加载训练好的模型。 知识点 回归任务分类任务…...
Maven 测试和单元测试介绍
一、测试介绍 二、单元测试 1)介绍 2)快速入门 添加依赖 <dependencies><!-- junit依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9…...