MVCC详解

什么是MVCC?

MVCC,即Multi-Version Concurrency Control (多版本并发控制)。它是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

通俗的讲,数据库中同时存在多个版本的数据,并不是整个数据库的多个版本,而是某一条记录的多个版本同时存在,在某个事务对其进行操作的时候,需要查看这一条记录的隐藏列事务版本id,比对事务id并根据事物隔离级别去判断读取哪个版本的数据。

数据库隔离级别读已提交、可重复读 都是基于MVCC实现的,相对于加锁简单粗暴的方式,它用更好的方式去处理读写冲突,能有效提高数据库并发性能。

MVCC实现的关键知识点

事务版本号

事务每次开启前,都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。这就是事务版本号。

隐式字段

对于InnoDB存储引擎,每一行记录都有两个隐藏列trx_idroll_pointer,如果表中没有主键和非NULL唯一键时,则还会有第三个隐藏的主键列row_id

undo log

undo log,回滚日志,用于记录数据被修改前的信息。在表记录修改之前,会先把数据拷贝到undo log里,如果事务回滚,即可以通过undo log来还原数据。

可以这样认为,当delete一条记录时,undo log 中会记录一条对应的insert记录,当update一条记录时,它记录一条对应相反的update记录。

undo log有什么用途呢?

  • 事务回滚时,保证原子性和一致性
  • 用于MVCC快照读

版本链

多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针(roll_pointer),连成一个链表,这个链表就称为版本链。如下:

其实,通过版本链,我们就可以看出事务版本号、表格隐藏的列和undo log它们之间的关系。我们再来小分析一下。

        1.假设现在有一张core_user表,表里面有一条数据,id为1,名字为孙权:

        2.现在开启一个事务A: 对core_user表执行update core_user set name ="曹操" where id=1,会进行如下流程操作

  • 首先获得一个事务ID=100
  • 把core_user表修改前的数据,拷贝到undo log
  • 修改core_user表中,id=1的数据,名字改为曹操
  • 把修改后的数据事务Id=101改成当前事务版本号,并把roll_pointer指向undo log数据地址。

快照读和当前读

快照读

读取的是记录数据的可见版本(有旧的版本)。不加锁,普通的select语句都是快照读,如:

select * from core_user where id > 2;

当前读

读取的是记录数据的最新版本,显式加锁的都是当前读

select * from core_user where id > 2 for update;
select * from account where id>2 lock in share mode;

Read View

  • Read View是什么呢? 它就是事务执行SQL语句时,产生的读视图。实际上在innodb中,每个SQL语句执行前都会得到一个Read View。
  • Read View有什么用呢? 它主要是用来做可见性判断的,即判断当前事务可见哪个版本的数据~

Read View是如何保证可见性判断的呢?我们先看看Read view 的几个重要属性

  • m_ids:当前系统中那些活跃(未提交)的读写事务ID, 它数据结构为一个List。
  • min_limit_id:表示在生成ReadView时,当前系统中活跃的读写事务中最小的事务id,即m_ids中的最小值。
  • max_limit_id:表示生成ReadView时,系统中应该分配给下一个事务的id值。
  • creator_trx_id: 创建当前read view的事务ID

Read view 匹配条件规则如下:

  • 如果数据事务ID trx_id < min_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。
  • 如果trx_id>= max_limit_id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。
  • 如果 min_limit_id =<trx_id< max_limit_id,需腰分3种情况讨论
  • (1).如果m_ids包含trx_id,则代表Read View生成时刻,这个事务还未提交,但是如果数据的trx_id等于creator_trx_id的话,表明数据是自己生成的,因此是可见的。
  • (2)如果m_ids包含trx_id,并且trx_id不等于creator_trx_id,则Read View生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
  • (3).如果m_ids不包含trx_id,则说明你这个事务在Read View生成之前就已经提交了,修改的结果,当前事务是能看见的。

MVCC实现原理分析

查询一条记录,基于MVCC是怎样的流程

  1. 获取事务自己的版本号,即事务ID
  2. 获取Read View
  3. 查询得到的数据,然后Read View中的事务版本号进行比较。
  4. 如果不符合Read View的可见性规则, 即就需要Undo log中历史快照;
  5. 最后返回符合规则的数据

InnoDB 实现MVCC,是通过 Read View+ Undo Log 实现的,Undo Log 保存了历史快照,Read View可见性规则帮助判断当前版本的数据是否可见。

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

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

相关文章

【完美世界】石昊拒绝云曦相认,爱而不得,云曦悲伤无助

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料《完美世界云曦篇》最新一集&#xff0c;为了云曦&#xff0c;石昊不远十万里&#xff0c;亲自送她回家&#xff0c;这份感情之真挚&#xff0c;绝对毋庸置疑。然而&#xff0c;令人感到不解的是&…

二维码智慧门牌管理系统升级:引领政务服务、寄件、开锁、刻章新潮流

文章目录 前言一、政务服务二、寄件服务三、便民开锁和刻章服务四、应用范围 前言 在科技不断进步的时代&#xff0c;二维码智慧门牌管理系统升级版正在改变我们的生活&#xff0c;为政务服务、寄件、便民开锁、刻章等多种业务应用提供全新的解决方案&#xff0c;使我们的日常…

Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub)

目录 前言插件安装方法插件一&#xff1a;文献翻译插件&#xff08;pdf-translate&#xff09;插件二&#xff1a;文献附件管理&#xff08;ZotFile&#xff09;插件三&#xff1a;中文文献插件&#xff08;茉莉花&#xff09;插件四&#xff1a;Sci-Hub 自动下载文献&#xff…

3D模型格式转换工具HOOPS Exchange对工业级3D产品HOOPS的支持与应用

一、概述 HOOPS Exchange是一套高性能模型转换软件库&#xff0c;可以给软件提供强大的模型的导入和导出功能&#xff0c;我们可以将其单独作为转换工具使用&#xff0c;也可以将其集成到自己的软件中。 同样&#xff0c;HOOPS 的其它产品&#xff0c;也离不开HOOPS Exchange…

Docker学习——②

文章目录 1、Docker是什么1.1 Docker本质1.2 Docker的引擎迭代1.3 Docker和虚拟机的区别1.4 Docker 为什么比虚拟机资源利用率高&#xff0c;启动快&#xff1f;1.5 Docker 和 JVM 虚拟化的区别&#xff1f; 2、Docker架构3、Docker生态3.1 新时代软件诉求3.2 Docker 解决方案 …

蓝桥杯 (C++ 求和 等差数列 顺子日期 灌溉)

目录 1、求和 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 2、等差数列 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 3、顺子日期 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 4、灌溉 题目&#xff1a; 代码&#xff1a; 1、求和…

误删的文件恢复了成乱码 误删的文件恢复了成乱码怎么调整

电脑系统&#xff1a;Windows11 电脑型号&#xff1a;惠普 软件版本&#xff1a;EasyRcovery14 关于电脑&#xff0c;我们可以说是非常熟悉&#xff0c;并熟练掌握了对电脑的最基本操作&#xff0c;比如复制、粘贴、新建、删除文件。但我们真的很懂它吗&#xff1f;比如误删…

Azure 机器学习 - 设置 AutoML 训练时序预测模型

目录 一、环境准备二、训练和验证数据三、配置试验支持的模型配置设置特征化步骤自定义特征化 四、可选配置频率和目标数据聚合启用深度学习目标滚动窗口聚合短时序处理非稳定时序检测和处理 五、运行试验六、用最佳模型进行预测用滚动预测评估模型精度预测未来 七、大规模预测…

计算虚拟化3——I/O设备虚拟化

目录 I/O基本概念 I/O设备与CPU连接图 CPU与I/O设备的交互 访问I/O设备&#xff08;IO Access&#xff09; 数据传输&#xff08;Data Tronhsfer&#xff09; I/O设备虚拟化技术 软件辅助全虚拟化 半虚拟化 Virtio协议基本概念 Virtqueue讲解 硬件辅助全虚拟化 I/O…

C语言编译过程总结

开发C程序有四个步骤&#xff1a;预处理、编译、汇编和链接。任何一个体系结构处理器上都可以使用C语言程序&#xff0c;只要该体系结构处理器有相应的C语言编译器和库&#xff0c;那么C源代码就可以编译并连接到目标二进制文件上运行。 我们创建一个test.c为例来讲解程序编译的…

【iOS免越狱】利用IOS自动化WebDriverAgent实现自动直播间自动输入

1.目标 由于看直播的时候主播叫我发 666&#xff0c;支持他&#xff0c;我肯定支持他呀&#xff0c;就一直发&#xff0c;可是后来发现太浪费时间了&#xff0c;能不能做一个直播间自动发 666 呢&#xff1f;于是就开始下面的操作。 2.操作环境 iPhone一台 WebDriverAgent …

从MFC初始化过程看rc文件的行为,并剖析关联控件变量的实质

以MFC对话框程序为例: 当我们打开资源编辑器时就可以很容易的添加各种控件窗口,资源编辑器实际上操作的是rc文件;那么这些控件窗口是何时被MFC创建与管理的 没有关联控件变量前,在资源编辑器中依然可以容易拖动控件,并显示出来;这个控件窗口是如何被创建和管理的: 资源编…

VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)

出于某种目的&#xff08;合法的&#xff0c;真的合法的&#xff0c;合同上明确指出可以这样做&#xff09;&#xff0c;我准备了一个重命名所有标识符的VS扩展&#xff0c;用来把一个C#库改头换面&#xff0c;在简单的测试项目上工作很满意&#xff0c;所有标识符都被准确替换…

SpringMVC Day 11 : 零 xml 配置

前言 欢迎来到《Spring MVC Day 11: 零XML配置》&#xff01;在之前的学习中&#xff0c;我们已经掌握了如何使用Spring MVC框架构建灵活、高效的Web应用程序。然而&#xff0c;我们可能还记得那些繁琐的XML配置文件&#xff0c;它们是我们在过去几天中使用的方式。 好消息是…

JavaScript设计模式之责任链模式

适用场景&#xff1a;一个完整的流程&#xff0c;中间分成多个环节&#xff0c;各个环节之间存在一定的顺序关系&#xff0c;同时中间的环节的个数不一定&#xff0c;可能添加环节&#xff0c;也可能减少环节&#xff0c;只要保证顺序关系就可以。 如下图&#xff1a; ES5写法…

selenium自动化测试入门 —— 定位frame和iframe中的元素对象

< frame> <iframe> 标签&#xff0c;浏览器会在标签中打开一个特定的页面窗口&#xff08;框架&#xff09;&#xff0c;它在本窗口中嵌套进入一个网页&#xff0c;当用selenium定位页面元素的时候会遇到定位不到frame框架内的元素的问题。 定位frame中的元素前我…

R语言gplots包的颜色索引表--全平台可用

R语言gplots包的颜色索引表–全平台可用

唯一ID如何生成,介绍一下目前技术领域最常使用的几种方法

纵使十面大山&#xff0c;又如何&#xff0c;无妨… 概述 唯一ID&#xff08;Unique Identifier&#xff09;是在计算机科学和信息技术领域中用于标识某个实体或数据的唯一标识符。生成唯一ID的方法可以根据具体需求和应用场景的不同而有所不同。以下是一些目前技术领域中常用…

链栈的练习

链栈练习 相关内容&#xff1a;栈的链式存储结构&#xff08;链栈&#xff09; //链栈的初始化、判空、入栈、出栈、读取栈顶元素 //链栈的结点&#xff1a;数据域、指针域 #include<stdio.h> #include<stdlib.h> typedef int Status; #define OK 1 #define ERRO…

Websocket @ServerEndpoint不能注入@Autowired

在websocket中使用ServerEndpoint无法注入Autowired、Value 问题分析 Spring管理采用单例模式&#xff08;singleton&#xff09;&#xff0c;而 WebSocket 是多对象的&#xff0c;即每个客户端对应后台的一个 WebSocket 对象&#xff0c;也可以理解成 new 了一个 WebSocket&…