InnoDB存储引擎对MVCC实现

news2024/10/28 23:22:44

MVCC(多版本并控制)

概念:MVCC 是一种并发控制机制。

作用:多个并发事务同时读写数据库时保持数据的一致性和隔离性

实现:在每个数据行上维护多个版本的数据来实现的。当一个事务要对数据库中的数据进行修改时,MVCC 会为该事务创建一个数据快照,而不是直接修改实际的数据行。

1、读操作

事务执行读操作的时候,会使用快照读取,事务不会读取其他事务尚未提交的修改。

2、写操作

事务执行写操作的时候,会生成一个新的数据版本,并将修改后的数据写入数据库。(原始版本的数据仍然存在,供其他事务使用快照读取)

3、事务提交和回滚
  • 事务提交后,所做的修改将成为数据库的最新版本,并且对其他事务可见。
  • 事务回滚时,所做的修改将被撤销,对其他事务不可见。
4、版本回收

防止数据库中的版本无限增长,MVCC会定期进行版本回收,从而释放空间。

总结:MVCC创建多个版本 和 使用快照读取来实现并发控制。读操作使用旧数据版本的快照,写操作创建新版本,并确保原始版本仍可以使用 。

一致性非锁定读

实现:加一个版本号 / 时间戳字段,查询时,将当前可见的版本号与对应记录的版本号进行对比,如果记录的版本号小于可见版本,则表示该记录可见。

多版本控制就是读非锁定读的实现。如果读取的行正在执行DELETEUPDATE操作,这时读取操作不会去等待行上锁的释放,InnoDB存储引擎会去读取行的快照(快照读)

锁定读

在锁定读下,读取的数据是数据的最新版本,这种读也被称为当前读,同时,锁定读会对读取到的记录加锁。

存在问题:如果是当前读,每次读取的都是最新数据,两次查询中间,如果有其他事务插入数据,就会导致幻读,所以,InnoDB在实现可重复读时,如果执行的是当前读,则会对读取的记录使用Next-key Lock,来防止其他事务在间隙间插入数据。

InnoDB 对MVCC的实现

在内部,InnoDB存储引擎为每行数据添加了三个隐藏字段

  • DB_TRX_ID(6字节):表示最后一次插入或更新该行的事务 id。此外,delete 操作在内部被视为更新,只不过会在记录头 Record header 中的 deleted_flag 字段将其标记为已删除
  • DB_ROLL_PTR(7字节) 回滚指针,指向该行的 undo log 。如果该行未被更新,则为空
  • DB_ROW_ID(6字节):如果没有设置主键且该表没有唯一非空索引时,InnoDB 会使用该 id 来生成聚簇索引

Undo-log(撤销日志)

作用:

  1. 事务回滚:事务回滚时用于将数据恢复到修改前的样子
  2. MVCC:当读取记录时,若该记录被其他事务占用或当前版本对该事务不可见,则可以通过undo log读取之前的版本数据,以此实现非锁定读

RC 和 RR隔离级别下MVCC的差异

在事务隔离级别 RCRR (InnoDB 存储引擎的默认事务隔离级别)下,InnoDB 存储引擎使用 MVCC(非锁定一致性读),但它们生成 Read View 的时机却不同

  • 在 RC 隔离级别下的 每次select 查询前都生成一个Read View (m_ids 列表)
  • 在 RR 隔离级别下只在事务开始后 第一次select 数据前生成一个Read View(m_ids 列表)

MVCC + Next-key Lock 防止幻读

InnoDB存储引擎在 RR 级别下通过 MVCCNext-key Lock 来解决幻读问题:

1、执行普通select,此时会以MVCC快照读的方式读取数据

在快照读的情况下,RR 隔离级别只会在事务开启后的第一次查询生成 Read View ,并使用至事务提交。所以在生成 Read View 之后其它事务所做的更新、插入记录版本对当前事务并不可见,实现了可重复读和防止快照读下的 “幻读”

2、执行 select…for update/lock in share mode、insert、update、delete 等当前读

在当前读下,读取的都是最新的数据,如果其它事务有插入新的记录,并且刚好在当前事务查询范围内,就会产生幻读!InnoDB 使用 Next-key Lock 来防止这种情况。当执行当前读时,会锁定读取到的记录的同时,锁定它们的间隙,防止其它事务在查询范围内插入数据。只要我不让你插入,就不会发生幻读

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

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

相关文章

动态规划 —— 路径问题-不同路径

1. 不同路径 题目链接: 62. 不同路径 - 力扣(LeetCode)https://leetcode.cn/problems/unique-paths/description/ 2. 算法原理 1. 状态表示:以莫一个位置为结尾 dp[i]表示:以[i,j]位置为结尾时&#xff0…

新手入门c++(8)

到时候了,是时候给你们讲一下其他的定义形式与格式化输入输出了。 1.长整型变量 长整型变量分为两种: ①long类型 在计算机编程中,long 类型是一个整型数据类型,用于存储较大的整数。它的大小和范围取决于操作系统和编译器的实…

存储引用服务(OSS)Minio 环境搭建

下载Docker desktop 最好进行相关的设置,比如说进行登陆docker账号等等 推荐使用 docker-engine源【目前还能使用下载】 https://ccr.ccs.tencentyun.com 使用docker拉取对应的minio镜像 netstat -aon|findstr "8081" 注意:dockerhub有时…

QT访问数据库:应用提示Driver not loaded

在QT中运行完全正确错误截图 解决办法 我用的是MySQL。我把libmysql.dll复制到应用程序的目录下,即可正常访问数据库。

Hugging Face 使用指南——并行智算云(10s上手版)

1. 在bash中使用 1.1 直接复制命令 echo export HF_ENDPOINT"https://hf-mirror.com" >> ~/.bashrc # 在bashrc文件中设置镜像地址 source ~/.bashrc # 使修改立即生效 echo $HF_ENDPOINT # 查看是否成功红框部分出现就是正确了 1.2 命令详解 命令行echo…

HarmonyOS开发 - 本地持久化之实现LocalStorage支持多实例

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 在上一篇中&…

CodeQL学习笔记(1)-QL语法(逻辑连接词、量词、聚合词、谓词和类)

最近在学习CodeQL,对于CodeQL就不介绍了,目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记,根据个人知识库笔记修改整理而来的,分享出来共同学习。个人觉得QL的语法比较反人类,至少与目前主流的这些OOP语言相比&…

计算机视觉专栏(2)【LeNet】代码实战【pytorch】完整可运行

LeNet 系列 实践部分1.引言2. limu代码3. plpal代码3.1 代码调试3.2 代码详解 4. 总结 实践部分 Lenet的实现分为两种代码,一种是李沐老师的实现代码以及b友up霹雳啪啦的代码,两者都有不同的优点,李老师的lenet十分还原原著中的操作&#xf…

ios 项目升级极光SDK

由于项目使用的是旧版本,隐私合规检查不通过,需要升级到最新版本, 使用cocoapods集成无法正常运行,.a文件找不到,可能项目比较久了,最好选择手动导入 下载最新版本SDK,将 SDK 包解压&#xff…

IROS 2024最新接收的Motion Planning前沿研究成果汇总

No.1 文章标题:Extended Tree Search for Robot Task and Motion Planning 作者:REN, Tianyu; Chalvatzaki, Georgia; Peters, Jan 中文标题:机器人任务和运动规划的扩展树搜索 No.2 文章标题:Kinodynamic Motion Planning fo…

Jmeter分布式性能测试细节+常见问题解决

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter分布式测试时需要的特别注意 1)参数化文件的位置和内容 如果使用csv文件进行参数化,即通过读取csv文件中的数据来为测试脚本提供…

C/C++每日一练:实现选择排序

选择排序 选择排序是一种简单直观的排序算法,时间复杂度为,其中 n 是数组长度,不适合大数据集的排序,适合于元素较少且对性能要求不高的场景。 选择排序的基本思想是:每次从未排序部分选择最小的元素,将其放…

[四轴飞行器] 遥控器操作说明

遥控器操作说明 1 A:无线连接信号强度:已连接 B:控制模式:H定高模式,T定点模式 C:遥控器状态:加锁 D:飞行模式:无头 E:电量显示:遥控器电量(加…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息,得到4组数字块。1.5 遍历数字块,将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

Jupyter Notebook 中使用render_notebook渲染pyecharts图像不显示的一种情况

一开始我发现自己的jupyter文件在渲染pyecharts图片时一开始可以显示,但后来不知道怎么的就不显示了,查找了很多方法,但是没有效果,都是改js渲染什么的,还有就是参数不对的,对于我来说都没什么用&#xff0…

Pytorch学习--DataLoader的使用

一、DataLoader简介 DataLoader官网 重要参数:画红框的参数 dataset: 作用:表示要加载的数据集。DataLoader通过该参数从数据集中读取数据。类型:Dataset,即PyTorch定义的Dataset类,用于封装数据并提供数据索引的功…

C++第八讲:STL--stack和queue的使用及模拟实现

C第八讲:STL--stack和queue的使用及模拟实现 1.stack的使用2.queue的使用3.栈和队列OJ题3.1题目1:最小栈3.2题目2:栈的压入、弹出序列3.3题目3:逆波兰表达式求值3.4题目4:用栈实现队列 4.栈的模拟实现5.队列的模拟实现…

BFS解决最短路问题(4)_为高尔夫比赛砍树

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 BFS解决最短路问题(4)_为高尔夫比赛砍树 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论&#x1f48…

LeetCode-684. 冗余连接

. - 力扣(LeetCode) 题目 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于…

传输层UDP

再谈端口号 端口号:标识了主机上进行通信的不同的应用程序 在TCP/IP 协议中我们用“源IP”"源端口号" “目的IP”“目的端口号” “协议号”五元组来标识一个通信 用netstat -n 查看 查看网络信息,我们有两种命令查看网络通信1.用netsta…