MySQL数据库-MVCC多版本并发控制

mvcc,多版本并发控制(Multi-Version Concurrency Control),是一种用于数据库管理系统中的并发控制方法.

在传统的并发控制方法中,如锁定机制,当一个事务修改数据时,会对相关的数据对象进行锁定,其他事务需要等待该锁释放才能进行操作。这种方法存在着事务之间相互等待的问题,容易导致死锁和性能瓶颈。

mvcc通过在数据库中保留数据的多个版本来解决这个问题。每次事务读取数据时,会根据该事物的时间戳或版本号获取对应的数据版本。当一个事务修改数据的时候,会创建一个新的数据版本,并将该事物的时间戳或版本号与数据版本关联起来。这样,在并发执行过程中,不同事务读取的是不同的数据版本,从而避免了锁的竞争和冲突,提高了并发性能。维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要分为了三个部分,第一个是隐藏字段,第二个是undo log日志,第三个是readView读视图。

隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事务id),记录每一次操作的事务id,记录每一次操作的事务id(自增).另一个字段是roll_pointer(回滚指针),指向上一个版本的事务版本记录地址。(row_id隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段)

undo log主要作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。sql语句中insert、update、delete的时候都会产生便于数据回滚的日志,在insert的时候,产生的undo log 日志只在回滚时需要,在事务提交后,可被立即删除。而update、delete的时候,产生undolog日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除。

readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问哪个版本的数据,不同的隔离级别快照读是不一样的,最终访问的结果不一样.

在 RC(Read Committed)隔离级别下,每一次执行快照读都会生成一个新的 ReadView。这意味着每个快照读都会基于当前数据库的提交状态生成一个新的 ReadView,并且在读取数据时只能看到已经提交的数据。因此,对于同一事务的多次快照读,可能会在不同的时间点看到不同的数据快照。

四个字段按照版本比较规则,数据链从上到下依次进行是否符合条件的比对。

简单理解:可以看readView之前数据链版本哪个已提交,所以第一次查询id为30的记录,可查询到的版本为事务2历史版本。第二次查询id为30的记录,可查询版本为事务3历史版本。

而在 RR(Repeatable Read)隔离级别下,仅在事务中第一次执行快照读时会生成一个 ReadView,并且后续的快照读都会复用该 ReadView。这意味着在同一事务中的多次快照读将看到相同的数据快照,即使其他事务已经对数据进行了修改或提交。

因此,RC 隔离级别下的快照读会在每次执行时生成新的 ReadView,而 RR 隔离级别下的快照读则会在事务中第一次执行时生成 ReadView 并在后续复用,这两种隔离级别下的快照读行为差异会导致在多版本并发控制中访问的数据结果不同。

这里RC与RR都是快照读,读取的是记录数据的可见版本,可能是历史记录,不加锁,是非阻塞读。ReadView是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的未提交事务的id。与之相对的概念是当前读,读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前事务,会对读取的记录进行加锁。sql语句中update、insert、delete都相当于上了排它锁,都是一种当前读。

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

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

相关文章

数据结构在JavaScript中的体现

一.概述 数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法,其实算法并不是一个很高级的东西,它充斥在每一种代码组织方式中;而且各种语言关于数据结构方面的内容都是大同小异的&…

奔跑吧小恐龙(Java)

前言 Google浏览器内含了一个小彩蛋当没有网络连接时,浏览器会弹出一个小恐龙,当我们点击它时游戏就会开始进行,大家也可以玩一下试试,网址:恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…

Python-web自动化-Playwright的学习

Python-web自动化-Playwright的学习 1. 安装playwright2. 界面等待3. 自动化代码助手4. 定位元素1. css selector定位2. xpath定位3. get_by_XXX定位 5. 操作元素1. 单选框、复选框2. select下拉框3. 网页操作4. 框架页 frame5. 窗口切换6. 截屏 1. 安装playwright pip命令 pi…

垃圾分类|城市垃圾分类管理系统|基于Springboot的城市垃圾分类管理系统设计与实现(源码+数据库+文档)

城市垃圾分类管理系统目录 目录 基于Springboot的城市垃圾分类管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、垃圾列表 2、公告信息管理 3、公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

(06)Hive——正则表达式

Hive版本:hive-3.1.2 一、Hive的正则表达式概述 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 Hive的正则表达式灵活使用解决HQL开发过程中的很多问题,本篇文…

代码随想录算法训练营第十七天|Leetcode110 平衡二叉树、Leetcode257 二叉树的所有路径、Leetcode404 左叶子之和

代码随想录算法训练营第十七天|Leetcode110 平衡二叉树、Leetcode257 二叉树的所有路径、Leetcode404 左叶子之和 ● Leetcode110 平衡二叉树● 解题思路● 代码实现 ● Leetcode257 二叉树的所有路径● 解题思路● 代码实现 ● Leetcode404 左叶子之和● 解题思路● 代码实现 …

esp8266-01s WIFI模块使用(一)- AT指令

时间记录:2024/2/15 一、注意事项 (1)使用英文双引号表示字符串数据 (2)默认波特率115200 (3)AT指令以“\r\n”结尾 (4)3.3V电源接口先连接单片机的3.3V,如…

7 大 Android 数据恢复软件,可轻松找回丢失的数据

每年,由于各种原因,数百万人从他们的 Android 设备中丢失数据。它可能像意外删除文件一样简单,也可能像系统崩溃一样复杂。在这种情况下,拥有高效的数据恢复工具可以证明是救命稻草。Mac 用户尤其需要找到与其系统兼容的软件。好消…

AtCoder Beginner Contest 335 (Sponsored by Mynavi) --- F - Hop Sugoroku -- 题解

目录 F - Hop Sugoroku 题目大意: 思路解析: 代码实现: F - Hop Sugoroku 题目大意: 思路解析: 容易想到这是一个dp题,然后初始转移方程为: 如果当a[i] 较大时,时间复杂度为 O(N…

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器:Tokenizer 词项过滤器:Token Filter 停用词 同义词 字符过滤器:Character Filter HTML 标签过滤器:HTML Strip Character Filter 字符映射过滤器&#x…

17.JS中的object、map和weakMap

1.object和map的区别 2.weakMap和map的区别 (1)Map本质上就是键值对的集合,但是普通的Object中的键值对中的键只能是字符串。而ES6提供的Map数据结构类似于对象,但是它的键不限制范围,可以是任意类型,是一…

使用bpmn-js 配置颜色

本篇文章介绍如何使用bpmn-js给图例配置颜色。该示例展示了如何向BPMN图添加颜色的多种不同方法。 通过层叠设置颜色 这种方式比较简单,直接通过设置图片的CSS层叠样式就可实现。 .highlight-overlay {background-color: green; /* color elements as green */opa…