什么是MVCC?MVCC解决了什么问题?MVCC的实现原理?

article/2025/11/10 0:42:49

1.什么是MVCC?

MVCC全称是【Multi-Version ConCurrency Control】即多版本控制协议。

多版本控制(Multiversion Concurrency Control): 指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,InnoDB通过undo log保存每条数据的多个版本,并且能够找回数据历史版本提供给用户读,每个事务读到的数据版本可能是不一样的。在同一个事务中,用户只能看到该事务创建快照之前已经提交的修改和该事务本身做的修改。

        MVCC只在 Read Committed 和 Repeatable Read两个隔离级别下工作。其他两个隔离级别和MVCC不兼容,Read Uncommitted总是读取最新的记录行,不需要MVCC的支持;Serializable 则会对所有读取的记录行都加锁,单靠MVCC无法完成。

        MySQL的InnoDB存储引擎默认事务隔离级别是RR(可重复读),是通过 "行级锁+MVCC"一起实现的,正常读的时候不加锁,写的时候加锁。而 MCVV 的实现依赖:隐藏字段、Read View、Undo log。

2.MVCC解决了什么问题?

在并发事务下,可能会产生如下问题:
1.脏读 :当前事务读取到其它事务未提交的数据。
2.脏写 : 事务B提交后,将事务A提交的数据覆盖。
3.不可重复读:在同一个事务中,不同时间段执行相同的查询语句,得到的结果集不相同。
4.幻读:事务A读取到了事务B新增的数据。

MVCC可重复读模式下,解决了事务的脏读、脏写、不可重复读等问题,但是还是存在幻读问题,幻读问题可以使用间隙锁进行解决。

3.MVCC的实现原理?

什么是行锁、表锁、间隙锁?

首先锁的存在,目的是为了在并发场景下,保持数据的安全、一致。

并发场景有:

读-读 :此并发场景不需要进行并发控制,也就是不需要加锁。

读-写 :此并发场景需要并发控制,不然就会出现脏读,幻读,不可重复读的问题。

写-写 :此并发场景需要并发控制,不然就会出现更新丢失的问题。

进行并发控制,常规手段就是加锁,其中mysql的锁有以下几种:

行锁:锁住表中的一行;比如 update user set name=‘张三’ where id=1;会锁住id=1的那一行数据,其他事务再想更新,就只能等前一个事务释放锁。

表锁:锁住整个表,比如update user set name=‘张三’;由于没有加where条件,此更新sql会对整个表进行更新,也就是会锁住整个表。

间隙锁:比如事务A执行update user set name=‘张三’ where id >1 and id<4; 假如表中只有id=1、2 两条数据,A事务还没提交,那么此时事务B再次插入一条id=3的数据,理论上是允许的,但是实际上是B只能等A提交,因为事务A执行的是id>1and id<4,范围涵盖了id=3的,也即是把id=3的这个间隙也给锁了,叫做间隙锁。

除了这3种锁,还有乐观锁、悲观锁、记录锁、自增锁、意向锁;

既然可以使用行锁、表锁、间隙锁来保证数据操作的安全性,那么还要MVCC的出现是为何呢? 实际是因为在性能方面还有优化的空间。

虽然使用锁可以保证数据安全,但是毕竟加了锁就意味着并发性能的降低,因此,能不使用锁就尽量不使用锁。在某些场景下,MVCC可以在比使用锁更快。

在读-读、读-写、写-写这3种并发场景中,读-写 可以不使用锁,而是使用MVCC来实现数据的并发操作以及安全一致性。

因此,mysql是同时使用了MVCC+行锁、表锁、间隙锁来保证了数据安全,又尽可能大的实现了性能最优化。

多版本

那么不使用锁,MVCC是如何更高效的解决读-写这种并发场景下的数据安全呢?

我们知道,事务在执行失败时,会将数据回滚为上个版本,而MVCC叫做多版本并发控制,核心概念就在版本上,也就是说数据库存储了多个版本的数据。

多个版本整体上分为两类:最新版本、历史版本。

这也牵扯出来另外两个概念:

快照读:读取的是数据库种历史版本的数据;

常规的select * from user ;属于是快照读;

当前读:读取的是数据库种最新版本的数据;当前读的操作有:

select * from user in share mode(共享锁),;

select * from user for update;

update, insert ,delete(排他锁)

那么多个版本,mysql是如何存储的呢?

innodb存储引擎中,我们存在表中的数据,除了我们设置的业务字段,另外还有3个默认字段,如下图末尾3个:


 


总结

 

MVCC:
1、MVCC在不加锁的情况下,解决了并发事务的脏读、脏写不可重复度等问题,而幻读可以使用间隙锁进行解决。
2、undo log里面通过两个隐藏字段trx_id、roll_pointer将历史快照数据串联起来,形成一个版本链,是read view获取数据的前提。
3、read view是在第一次查询时生成的,由所有未提交的活跃事务id组成的数组和最大事务id构成。
4、通过对比事务id的大小,将数据进行展示。


http://chatgpt.dhexx.cn/article/pRRpCFvl.shtml

相关文章

MVCC详解,深入浅出简单易懂

一、什么是MVCC&#xff1f; mvcc&#xff0c;也就是多版本并发控制&#xff0c;是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。 数据库并发有以下几种场景&#xff1a; 读-读&#xff1a;不存在任何问题。读-写&#xff1a;有线程安全问题&#xff0c;可能出…

【MySQL笔记】正确的理解MySQL的MVCC及实现原理

MVCC多版本并发控制 如果觉得对你有帮助&#xff0c;能否点个赞或关个注&#xff0c;以示鼓励笔者呢&#xff1f;&#xff01;博客目录 | 先点这里 &#xff01;首先声明&#xff0c;MySQL 的测试环境是 5.7 前提概要 什么是 MVCC什么是当前读和快照读&#xff1f;当前读&…

Oracle自定义函数

使用Navicat的话&#xff0c;可以点击函数&#xff0c;新建函数&#xff0c;根据引导完成一个函数的基本搭建。 语法和Java类似&#xff0c;其中对于变量赋值要使用 : 进行赋值。 具体语法可以参考一下 Oracle 自定义函数语法与实例_桑汤奈伊伏的博客-CSDN博客_oracle 自定义函…

Oracle 创建函数

Oracle创建函数是通过PL/SQL自定义编写的&#xff0c;通过关键字function按照自己的需求把复杂的业务逻辑封装进PL/SQL函数中&#xff0c;函数提供一个返回值&#xff0c;返回给使用者。这样使用者就不需要去理解业务逻辑&#xff0c;把PL/SQL函数中的业务逻辑交给专门的开发人…

Oracle函数的使用

在进行select查询的时候&#xff0c;可以为列指定函数&#xff0c;函数是sql语句中的一个非常有用的特性&#xff0c;oracle内置了用于处理字符&#xff0c;数字&#xff0c;日期及转换的各种函数&#xff0c;使用函数能够执行数据计算&#xff0c;修改列数据的显示&#xff0c…

Oracle函数【详细 包括举例】

概述 Oracle SQL 提供了用于执行特定操作的专用函数。这些函数大大增强了 SQL 语言的功能。函数可以接受零个或者多个输入参数&#xff0c;并返回一个输出结果。 Oracle 数据库中主要使用两种类型的函数&#xff1a; 1. 单行函数&#xff1a;对每一个函数应用在表的记录中时&a…

Oracle 函数编写

CREATE OR REPLACE FUNCTION f_homestay_count (wkt_poly CLOB ) RETURN NUMBER IS result NUMBER ; BEGINSELECTCOUNT (*) INTO resultFROMHOMESTAY_BASIC TWHEREsdo_anyinteract (T .geom_point,sdo_geometry (wkt_poly, 4326)) TRUE; RETURN (result) ;END ;因为之前都是…

Oracle 自定义函数

语法结构 CREATE [OR REPLACE] FUNCTION 定义的函数名称(参数名1 参数类型,参数名2 参数类型, ...) RETURN 返回值类型 AS/IS 返回值形参 形参类型实例化 BEGIN 方法体 &#xff08;其中用到if判断的话&#xff0c;每一个if对应一个end if&#xff0c;出现几次if就会有几个end…

oracle常用函数

1.sign sign函数是根据给的数为正数&#xff0c;就返回1,0返回0&#xff0c;负数返回-1。需要注意sign&#xff08;这个括号里面只能是个字段&#xff09;&#xff0c;在括号中写个子查询直接就报错了&#xff01; 2.decode 用法&#xff1a; decode(条件,值1,返回值1,值2,返回…

Oracle(四)Oracle 函数

目录 函数介绍Oracle字符型函数Oracle日期型函数系统日期、时间函数&#xff1a;数据库时区函数&#xff1a;给日期加上指定的月份函数&#xff1a;月份最后一天函数:指定日期后一周的日期函数:返回指定日期中特定部分的函数&#xff1a;返回两个日期间的月份数&#xff1a;日期…

oracle函数instr函数

1 instr函数的概念 在Oracle中可以使用instr函数对某个字符串进行判断&#xff0c;判断其是否含有指定的字符。在一个字符串中查找指定的字符,返回被查找到的指定 的字符的位置。 2 语法 instr(sourceString,destString,start,appearPosition) instr&#xff08;‘源字符串’,‘…

Oracle常用函数【建议收藏】

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;目前从事DBA及程序编程 &#xff08;Web\java\Python&#xff09;工作&#xff0c;主要服务于生产制造 现拥有 Oracle 11g OCP/OCM、 Mysql、Oceanbase&#xff08;OBCA&#xff09;认证 分布式TBase\TDSQL数据库、国…

Oracle常用函数大全

说明&#xff1a;新文章地址转为 Oracle数据库函数大全_長安社-王于铭.YuMing的博客-CSDN博客https://hevnchin.blog.csdn.net/article/details/132054755 MySQL数据库系统函数大全_長安社-王于铭.YuMing的博客-CSDN博客year&#xff1a;年份、month&#xff1a;月份、day&am…

Oracle中的函数(详细!!!)

文章目录 前言一、SQL中的函数两种SQL函数单行函数单行函数的分类1. 字符型函数LOWER函数UPPER函数INITCAP函数CONCAT函数SUBSTR函数INSTR函数LPAD|RPAD函数REPLACE函数 2. 数字函数ROUND函数TRUNC函数MOD函数 3. 使用日期查看系统时间根据时间查询信息日期的运算MONTHS_BETWEE…

OpenDaylight通过netconf对接netopeer2

目的 利用OpenDaylight(client)的南向接口netconf对接netopeer2(server) 搭建netopeer2 启动Ubuntu20的docker&#xff0c;将内部830端口映射为主机的22830端口 adminubuntu20:~$ docker run -d --name netopeer2_server --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro…

ORAN专题系列-16:5G O-RAN FrontHaul前传接口的网络配置管理协议netconf

前言 前传接口&#xff08;FrontHual&#xff09;是传统的BBU与RU之间的接口&#xff0c;在O-RAN之前&#xff0c;前传接口虽然定义了物理连接的CPRI接口规范标准&#xff0c;但CPRI之上承载的M plane的配置管理数据格式&#xff0c;却是设备厂家私有的。 有基于TCP的、有基于…

实验三:Netconf 接口配置实验(基于Schema API)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Netconf简介1.基本网络架构2.协议框架3.报文格式4.会话建立过程 二、实验步骤1.设备预配2.运维代码编写3.实验结果 前言 云时代对网络的关键诉求之一是网络…

Java NetConf 使用

1. 参考资料 工具包GIT地址 : https://github.com/Juniper/netconf-java 使用教程 : https://www.juniper.net/documentation/cn/zh/software/junos/netconf-java-toolkit/topics/task/netconf-java-toolkit-program-creating-and-executing.html 2. 下载&编译工具包 # 1. …

ComNet

1 ComNet 简介 ComNet设计的核心思想就是用深度神经网络来代替OFDM接收机&#xff0c;和FC-DNN类似。但是最大的不同之处&#xff0c;对接收机进行细化&#xff0c;将接收机分为了为信道估计子网和信号检测子网。每个子网由一个DNN构造&#xff0c;使用现有的简单、传统的解决…

「Python 网络自动化」NETCONF —— Python 使用 NETCONF 管理配置 H3C 网络设备

「Python 网络自动化」系列文章总目录 Nornir 中文手册——基于 Nornir3.0 官方文档的不完全翻译 文章目录 NETCONF 简单介绍NETCONF 协议结构NETCONF 报文结构请求报文格式报文回复格式 NETCONF 配置数据库NETCONF 支持的操作 实验操作基础环境配置网络环境设备配置代码环境 …