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://xiahunao.cn/news/2780570.html

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

相关文章

Stable Diffusion 模型下载:RealCartoon-Anime - V10

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

第5集《佛说四十二章经》

和尚尼慈悲、诸位法师、诸位居士,阿弥陀佛! 请大家打开讲义第五面,第三章、割爱去贪。 蕅益大师他把《四十二章经》的内涵分成两个部分:第一部分是第一章、第二章的正道法门;其次,第三章之后共有四十章都…

Vue3中Setup概述和使用(三)

一、引入Setup 1、Person.Vue 与Vue3编写简单的App组件(二) 中的区别是&#xff1a;取消data、methods等方法,而是将数据和方法定义全部放进setup中。 <template><div class"person"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h…

车载软件架构 —— Adaptive AUTOSAR是软件架构的正解吗?

车载软件架构 —— Adaptive AUTOSAR是软件架构的正解吗&#xff1f; 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师&#xff08;Wechat&#xff1a;gongkenan2013&#xff09;。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文…

【JVM篇】分析并讲解字节码文件

文章目录 &#x1f354;字节码文件⭐打开字节码文件的工具⭐字节码文件的组成✨具体分析 &#x1f354;字节码文件 字节码文件是一种中间表示形式&#xff0c;它通常由编译器将高级编程语言&#xff08;如Java、Python等&#xff09;源代码编译而成。字节码文件包含了程序的指…

分享88个文字特效,总有一款适合您

分享88个文字特效&#xff0c;总有一款适合您 88个文字特效下载链接&#xff1a;https://pan.baidu.com/s/1Y0JCf4vLyxIJR6lfT9VHvg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

Java串口通信技术探究1:深入理解RXTX库

目录 一、RXTX库简介二、RXTX库工作原理三、RXTX库的应用场景四、RXTX库的兼容性五、RXTX库下载及安装 在现代嵌入式系统中&#xff0c;串口通信是一种非常常见的通信方式。通过串口&#xff0c;设备之间可以传输各种类型和格式的信息。Java作为一种流行的编程语言&#xff0c;…

C++多线程学习[五]:RAII锁

一、什么是RAII 使用局部对象来控制资源的技术&#xff0c;即它的生命周期由操作系统来管理&#xff0c;无需人工的介入。 为什么要采用RAII技术呢&#xff1f; 主要是在开发过程中资源的销毁容易忘记&#xff0c;容易造成死锁或内存泄露。 {}为一个区域 &#xff0c;这里锁的…

java nio零拷贝

零拷贝是一种计算机执行IO操作的优化技术&#xff0c;其核心目标是减少数据拷贝次数&#xff0c;从而提高系统性能。它主要体现在以下几个方面&#xff1a; 1. **定义与原理**&#xff1a;零拷贝字面上的意思包括“零”和“拷贝”。其中&#xff0c;“拷贝”是指数据从一个存储…

单片机与外设的交互

单片机与外设的交互是嵌入式系统中非常重要的一个基础知识点。单片机是一个集成在同一芯片上的中央处理器、存储器和输入/输出接口,它可以根据用户编写的程序与各种外部设备即外设进行交互。单片机与外设之间的交互主要通过单片机上的输入/输出口(I/O口)来实现。 I/O口的工作原…

Python访问数据库

目录 SQLite数据库 SQLite数据类型 Python数据类型与SQLite数据类型的映射 使用GUI管理工具管理SQLite数据库 数据库编程的基本操作过程 sqlite3模块API 数据库连接对象Connection 游标对象Cursor 数据库的CRUD操作示例 示例中的数据表 无条件查询 有条件查询 插入…

快速学习Spring

Spring 简介 Spring 是一个开源的轻量级、非侵入式的 JavaEE 框架&#xff0c;它为企业级 Java 应用提供了全面的基础设施支持。Spring 的设计目标是简化企业应用的开发&#xff0c;并解决 Java 开发中常见的复杂性和低效率问题。 Spring常用依赖 <dependencies><!-…

【C语言】C的整理记录

前言 该笔记是建立在已经系统学习过C语言的基础上&#xff0c;笔者对C语言的知识和注意事项进行整理记录&#xff0c;便于后期查阅&#xff0c;反复琢磨。C语言是一种面向过程的编程语言。 原想在此阐述一下C语言的作用&#xff0c;然而发觉这些是编程语言所共通的作用&#…

使用securecrt+xming通过x11访问ubuntu可视化程序

windows使用securecrtxming通过x11访问ubuntu可视化程序 windows机器IP&#xff1a;192.168.9.133 ubuntu-desktop20.04机器IP&#xff1a;192.168.9.190 windows下载xming并安装 按照图修改xming配置 开始->xming->Xlaunch 完成xming会在右下角后台运行 windows在…

LeetCode Python -8.字符串转整数

文章目录 题目答案运行结果 题目 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查下一个…

大数据Doris(六十五):基于Apache Doris的数据中台2.0

文章目录 基于Apache Doris的数据中台2.0 一、​​​​​​​架构升级

分享76个时间日期JS特效,总有一款适合您

分享76个时间日期JS特效&#xff0c;总有一款适合您 76个时间日期JS特效下载链接&#xff1a;https://pan.baidu.com/s/1s7tPGT_ItK7dNK5_qbZkug?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

C语言 服务器编程-日志系统

日志系统的实现 引言最简单的日志类 demo按天日志分类和超行日志分类日志信息分级同步和异步两种写入方式 引言 日志系统是通过文件来记录项目的 调试信息&#xff0c;运行状态&#xff0c;访问记录&#xff0c;产生的警告和错误的一个系统&#xff0c;是项目中非常重要的一部…

《Linux 简易速速上手小册》第7章: 网络配置与管理(2024 最新版)

文章目录 7.1 Linux 网络基础7.1.1 重点基础知识7.1.2 重点案例&#xff1a;配置静态 IP 地址7.1.3 拓展案例 1&#xff1a;使用 nmcli 配置网络&#xff08;适用于 Fedora/CentOS&#xff09;7.1.4 拓展案例 2&#xff1a;配置无线网络连接 7.2 静态与动态 IP 配置7.2.1 重点基…