一文读懂MVCC:数据库中的并发读写利器!

news2024/11/16 19:45:47

大家好,我是你们的小米,一个积极活泼、喜好分享技术的小伙伴。今天,我想和大家聊一聊数据库领域的一个重要话题——MVCC多版本并发控制。MVCC是MySQL和其他一些数据库系统中常用的并发控制技术,通过它,我们可以在高并发读写的场景中提高数据库的性能。让我们一起来深入了解吧!

什么是MVCC

MVCC全称为Multi-Version Concurrency Control,中文翻译为多版本并发控制。它是一种用于数据库系统中处理并发读写操作的技术。MVCC通过为每个读写操作创建多个版本的数据来解决并发冲突,从而实现了读操作与写操作之间的并发执行,提高了数据库的并发性能。

什么是当前读

在MVCC中,当前读操作是指读取最新数据版本的操作。下面是一些常见的当前读语句:

  • SELECT ... FOR UPDATE:用于读取数据并获取写锁。
  • SELECT ... LOCK IN SHARE MODE:用于读取数据并获取读锁。

什么是快照读

快照读是指读取历史数据版本的操作,也可以称为非锁定读操作。下面是一些常见的快照读语句:

  • SELECT:普通的查询语句,用于读取数据。

当前读、快照读、MVCC之间的关系

当前读和快照读是MVCC中两种不同的读操作方式。当前读获取的是最新的数据版本,可以用于读写冲突的处理,而快照读获取的是历史的数据版本,用于读取一致性的数据视图。MVCC通过管理和维护这些不同版本的数据,实现了并发读写操作

MVCC解决的问题

数据库并发场景有三种,分别是:

  • 读读冲突:多个读操作之间不会产生冲突,可以并发执行。
  • 读写冲突:读操作不会被写操作所阻塞,读操作可以读取到之前的数据版本,保证了读的一致性。
  • 写写冲突:写操作之间不会产生冲突,可以并发执行。

MVCC是一种用来解决读写冲突的无所并发控制,也就是为事务分配单项增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照,所以MVCC可以为数据库解决以下问题:

  • 并发读写性能提升:在并发读写数据库时,MVCC可以做到在读操作时不用阻塞写操作,在写操作时不用阻塞读操作,提高了数据库并发读写的性能。
  • 事务隔离:MVCC可以解决脏读、幻读、不可重复读等事务隔离的问题,但是不能解决更新丢失问题。

MVCC实现原理

MVCC的实现原理主要依赖于记录中的三个隐藏字段、undolog、read view来实现的。

隐藏字段

MVCC通过在数据表中添加一些隐藏字段来实现多版本控制。这些隐藏字段包括:

  • DB_TRX_ID:用于标识事务的唯一ID。
  • DB_ROLL_PTR:指向undo log中的回滚段指针。
  • DB_ROW_ID:用于唯一标识一行数据。

undolog

undolog是MVCC实现中的一个重要组件,用于记录数据的修改历史。在MVCC中,insert操作和update/delete操作都会产生对应的undolog。

  • insert操作:在插入一行数据时,会生成一条insert类型的undolog,记录了插入数据的操作。
  • update和delete操作:在更新或删除一行数据时,会生成一条delete类型的undolog,记录了删除或修改之前的数据。

read view

read view是MVCC中用于管理数据版本的重要概念,它是一个逻辑数据视图。下面是一些关于read view的重要信息:

  • Read View的定义:Read view是一个事务开始时创建的数据视图,用于确定事务的隔离级别和可见性规则。
  • Read View的作用:Read view用于确定一个事务可以看到哪些数据版本,以及其他事务是否可以看到该事务修改的数据。

Read View中三个全局属性

在MVCC中,Read view具有三个全局属性,分别是trx_list、up_limit_id和low_limit_id。

  • trx_list:记录了当前活动的事务列表,其中每个事务包含一个事务ID和一个读视图。
  • up_limit_id:是一个全局的递增ID,用于判断事务的可见性。
  • low_limit_id:是一个全局的递增ID,用于判断事务的可见性。

Read View的可见性比较规则

基于上述三个全局属性,Read View的可见性比较规则如下:

  1. 如果DB_TRX_ID < up_limit_id,则当前事务能看到DB_TRX_ID 所在的记录,如果大于等于进入下一个判断;
  2. 如果 DB_TRX_ID ≥ up_limit_id,则代表 DB_TRX_ID 所在的记录在 Read View 生成后才出现的,那么对于当前事务肯定不可见,如果小于,则进入下一步判断;
  3. 判断 DB_TRX_ID 是否在活跃事务中,如果在,则代表在Read View 生成时刻,这个事务还是活跃状态,还没有 commit,修改的数据,当前事务也是看不到;如果不在,则说明这个事务在 Read View 生成之前就已经开始 commit,那么修改的结果是能够看见的。

MVCC的整体处理流程

假设有四个事务T1、T2、T3和T4,它们按顺序开始执行,并进行读写操作。MVCC的整体处理流程如下:

  1. T1开始执行时,创建一个新的read view,并设置up_limit_id和low_limit_id为无穷大。
  2. T1执行读操作,获取到数据库中的数据版本。
  3. T1执行写操作,修改数据库中的数据,并生成对应的undolog。
  4. T1提交事务,将up_limit_id设置为T1的事务ID。
  5. T2开始执行时,创建一个新的read view,并设置up_limit_id为无穷大,low_limit_id为T1的事务ID。
  6. T2执行读操作,根据read view获取到数据库中的数据版本。
  7. T3开始执行时,创建一个新的read view,并设置up_limit_id为无穷大,low_limit_id为T1的事务ID。
  8. T3执行写操作,修改数据库中的数据,并生成对应的undolog。
  9. T4开始执行时,创建一个新的read view,并设置up_limit_id为无穷大,low_limit_id为T1的事务ID。
  10. T4执行读操作,根据read view获取到数据库中的数据版本。

通过上述流程,MVCC保证了不同事务之间的并发读写操作,并根据每个事务的read view确定数据的可见性。

RC、RR级别下的InnoDB快照读区别

在InnoDB中,RC(Read Committed)和RR(Repeatable Read)是两种常见的隔离级别。在这两种隔离级别下,InnoDB的快照读有以下不同之处:

  • 在RR级别下,每个事务的read view是在事务开始时创建的,并在整个事务期间保持不变。这意味着在RR级别下,事务可以看到之前读取的数据版本,即使其他事务已经修改了数据。
  • 在RC级别下,每个语句都会创建一个新的read view,并在执行语句期间保持不变。这意味着在RC级别下,事务每次读取数据都会使用新的read view,而不会看到其他事务已经修改的数据。
  • RR级别下的快照读会导致更多的数据版本被保留在undo log中,因为每个事务的read view都需要保留。而在RC级别下,每个语句的read view只需要保留一次,因此占用的存储空间较少。
  • 总结:在RC隔离级别下,是每个快照读都会生成并获取最新的 Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读会创建 Read View,之后的快照读获取的都是同一个 Read View。

总结

MVCC多版本并发控制是一种提高数据库并发性能的重要技术。通过使用当前读和快照读,MVCC能够解决读读、读写和写写冲突,并提高并发读写数据库的性能。它还能解决事务隔离的问题,但无法解决更新丢失问题。MVCC的实现原理涉及隐藏字段、undolog和read view等组件,通过管理这些组件,实现了并发读写操作。在不同的隔离级别下,快照读的行为也会有所不同。RR级别下的快照读可以看到之前读取的数据版本,而RC级别下的快照读每次读取都使用新的read view。

 

END

对于数据库开发和性能优化来说,了解和掌握MVCC技术是非常重要的。希望本篇文章能给大家带来一些启发和帮助。如果有任何问题或者想法,欢迎留言讨论!

 

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

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

相关文章

如何用 Python 实现所有算法?

学会了 Python 基础知识&#xff0c;想进阶一下&#xff0c;那就来点算法吧&#xff01;毕竟编程语言只是工具&#xff0c;结构算法才是灵魂。 新手如何入门 Python 算法&#xff1f; 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码&#xff0…

milkV-duo的Linux的开发环境搭建

目录 写在前面 内核编译 烧录失败的示例&#xff08;这种情况下就和插上空卡一样) 进入系统 串口进入 SSH接入 写在前面 基本上大部分的问题都能在开源社区上得到答案,记录下我遇到的问题. 附上开源社区 MilkV Community 这里的引脚图和板子的丝印有点对不上&#xff…

竞赛中常用的Python 标准库

对竞赛中常用得标准库进行解析和给出代码模板 目录 1.functools 1.1 cmp_to_key 1.2 lru_cache&#xff08;记忆化存储&#xff0c;加快递归速度&#xff09; 2.collections 2.1 deque 2.1.1 单调对列实现 2.1.2 BFS广搜 3.sys 3.1 sys.maxsize 3.2 sys.exit() 3.…

使用python的plot绘制loss、acc曲线,并存储成图片

使用 python的plot 绘制网络训练过程中的的 loss 曲线以及准确率变化曲线&#xff0c;这里的主要思想就时先把想要的损失值以及准确率值保存下来&#xff0c;保存到 .txt 文件中&#xff0c;待网络训练结束&#xff0c;我们再拿这存储的数据绘制各种曲线。 其大致步骤为&#x…

代码自动生成工具——TableGo(实例演示)

一、常用的代码生成器工具介绍 在SpringBoot项目开发中&#xff0c;为了提高开发效率&#xff0c;我们经常需要使用代码自动生成工具来生成一些重复性的代码&#xff0c;比如实体类、DAO、Service、Controller等等。下面介绍几个常用的代码自动生成工具&#xff1a; ①、MyBat…

如何在Linux 启用组播

第一章: 前言 多播技术&#xff0c;也被称为“组播”&#xff0c;是一种网络通信机制&#xff0c;它允许一个节点&#xff08;发送者&#xff09;向一组特定的节点&#xff08;接收者&#xff09;发送信息。这种方式在网络编程中非常有用&#xff0c;因为它可以大大提高效率和…

深度学习(Pytorch):Softmax回归

Softmax简介 Softmax回归是一个用于多类分类问题的线性模型&#xff0c;它是从Logistic回归模型演变而来的。Softmax回归与Logistic回归类似&#xff0c;但是输出不再是二元的&#xff0c;而是多类的。Softmax回归引入了softmax激活函数来将输出转换为合理的概率分布。与线性回…

HCIE-Cloud Computing LAB备考--第五题:规划--Type13练习--记忆技巧+默写

对LLD表,交换机接口表,ensp配置进行练习,如下图,设置答案和空白表,进行默写,汇总自己的容易犯的错误 LLD表默写思路 交换机接口配置表默写思路 以Type3为例,同颜色复制即可,共用ST.P0是A25,ST.P2是A21,FS是ST.P0是A21,ST.P2是A21。 ensp配置默写思路 特点: 所…

一步一步学习 Stable Diffusion

一步一步学习 Stable Diffusion 0. 背景1. 安装2. 汉化3. 安装 sd-webui-controlnet 插件4. 安装 sd-webui-segment-anything 插件5. 安装 ultimate-upscale 插件6. 安装 SadTalker 插件7. 下载和配置 VAE 模型8. 使用 ChilloutMix 模型99. 未完待续 0. 背景 网上看了很多 Sta…

priority_queue(优先级队列)

priority_queue 1. priority_queue的介绍及使用1.1 priority_queue的介绍1.2 priority_queue的使用1.2.1 constructor(构造)1.2.2 empty1.2.3 size1.2.4 top1.2.5 emplace1.2.6 push、pop、swap 1.3 数组中第K个大的元素 2.priority_queue的深度剖析及模拟实现 1. priority_que…

Makerbase SimpleFOC ESP32例程4 双电机闭环速度测试

Makerbase SimpleFOC ESP32例程4 双电机闭环速度测试 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线156pin杜邦线2 注意&#xff1a;YT2804是改装的云台无刷电机,带有AS5600编码器&#xff0c;可实现360连续运转。…

柔性作业车间调度

1柔性车间作业调度 个工件 要在 台机器 上加工。每个工件包含一道或多道工序&#xff0c;工序顺序是预先确定的&#xff0c;每道工序可以在多台不同加工机器上进行加工&#xff0c;工序的加工时间随加工机器的不同而不同。调度目标是为每道工序选择最合适的机器、确定每台机器…

【C语言】语言篇——数组和字符串

C站的小伙伴们&#xff0c;大家好呀&#x1f61d;&#x1f61d;&#xff01;我最近在阅读学习刘汝佳老师的《算法竞赛入门经典》&#xff0c;今天将整理本书的第三章——数组和字符串的一些习题&#xff0c;本章习题较多&#xff0c;下选取部分习题进行练习总结&#xff0c;在这…

200道面试题(附答案)

最近有不少小伙伴跑来咨询&#xff1a; 想找网络安全工作&#xff0c;应该要怎么进行技术面试准备&#xff1f;工作不到 2 年&#xff0c;想跳槽看下机会&#xff0c;有没有相关的面试题呢&#xff1f; 为了更好地帮助大家高薪就业&#xff0c;今天就给大家分享两份网络安全工…

ubuntu20.04 ffmpeg mp4转AES加密的m3u8分片视频

样本视频(时长2分35秒): 大雄兔_百度百科 大雄兔_百度百科不知大家否看过世界上第一部开源电影&#xff1a;Elephants Dream&#xff08;大象之梦&#xff09;。这是一部由主要由开源软件Blender制作的电影短片&#xff0c;证明了用开源软件也能制作出效果媲美大公司的作品。…

1-9 随机算法【手写+Xmind笔记】

文章目录 1 Min-Cut【手写笔记】1.1 问题描述1.2 解决方案1.3 概率证明 2 赠券收集【手写笔记】3 快排期望【手写笔记】4 素数性质【手写笔记】4.1 基本性质4.2 解决方案4.3 群论4.4 费马小定理4.5 Miller Rabin素性测试 5-6 力矩与偏差【手写笔记】5.1 基础不等式5.2 矩生成函…

[图表]pyecharts模块-柱状图

[图表]pyecharts模块-柱状图 先来看代码&#xff1a; from pyecharts.charts import Bar from pyecharts.faker import Faker from pyecharts.globals import ThemeTypec (Bar({"theme": ThemeType.MACARONS}).add_xaxis(Faker.choose()).add_yaxis("商家A&q…

Spring 核心概念之一 IoC

前言 欢迎来到本篇文章&#xff01;通过上一篇什么是 Spring&#xff1f;为什么学它&#xff1f;的学习&#xff0c;我们知道了 Spring 的基本概念&#xff0c;知道什么是 Spring&#xff0c;以及为什么学习 Spring。今天&#xff0c;这篇就来说说 Spring 中的核心概念之一 Io…

day2 -- 数据库的安全管理和维护

brief 访问控制的目的不仅仅是防止用户的恶意企图。数据梦魇更为常见的是无意识错误的结果&#xff0c;如错打MySQL语句&#xff0c;在不合适的数据库中操作或其他一些用户错误。通过保证用户不能执行他们不应该执行的语句&#xff0c;访问控制有助于避免这些情况的发生。管理…

Makerbase SimpleFOC ESP32 例程6 双电机闭环位置力矩互控

Makerbase SimpleFOC ESP32 例程6 双电机闭环位置力矩互控 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线156pin杜邦线2 注意&#xff1a;YT2804是改装的云台无刷电机,带有AS5600编码器&#xff0c;可实现360连续运…