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

时间:2024-02-11 22:30:21 标签:  版本  

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都相当于上了排它锁,都是一种当前读。

来源:分享自作者个人站点/博客

智能推荐

mvcc,多版本并发控制(Multi-Version Concurrency Control),是一种用于数据库管理系统中的并发控制方法. 在传统的并发控制方法中,如锁定机制,当一个事务修改数据时,会对相关的数据对象进行锁定,其他事务需要等待该锁释放才能进行操作。这种方法存在着事务之间相互等待的问题,容易导致死锁和性能瓶颈。 mvcc通过在数据库中保留数据的多个版本来解决这个问题。每次事务读取数据时,会根据该事物的时间戳或版本号获取对应的数据版本。当一个事务修改数据的时候,会创建一个新的数据版本,并将该事物的时间戳或版本号与数据版本关联起来。这样,在并发执行

标签:版本  

MVCC出现背景 事务的4个隔离级别以及对应的三种异常 读未提交(Read uncommitted) 读已提交(Read committed&#xff0

标签:版本  

行级锁的一个变种避免了加锁,开销低非阻塞读操作,写操作是行级原理:使用数据在某个时间点的快照实现,不同事务在同一个时间可以看到同一个表中的不同数据。

标签:版本  

MVCC MVCC,是Multiversion Concurrency Control的缩写,翻译过来是多版本并发控制,和数据库锁样,他也是一种并发控制的解决方案 我们知道,在数据库中,对数据的操作主要有2种,分别是读和写,而在并发场景下,就可能出现以下 旦三种情况:读-读并发,读-写并发,写-写并发 我们都知道,在没有写的情况下读-读并发是不会出现问题的,而

标签:版本  

介绍多版本并发控制多版本并发控制技术(Multiversion Concurrency Control,MVCC)技术是为了解决问题而生的,通过 MVCC 我们可以解决以下几个问题:读写之间阻塞的问题:通过 MVCC 可以让读写互相不阻塞,即读不阻塞写,写不阻塞读,这样就可以提升事务并发处理能力。降低了死锁的概率:这是因为 MVCC 没有使用锁,读取数据时并不需要加锁,对于写操作,也只锁定必要的行。解决一致性读的问题:一致性读也被称为快照读,当我们查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新的结果,而不能看到这个时间点之后事务提交更

标签:版本  MVCC  

目录 MVCC 介绍当前读和快照读当前读快照读 MVCC 原理解析隐式字段Undo Lo

标签:一文  

欢迎大家关注我的微信公众号:  传送门:Mysql事务原理与优化   目录 概述 

标签:级别  

前置知识当前读与快照读当前读什么是当前读:读取的是最新的数据,不会读到老数据。何时触发:update、insert、delete、select lock in share mode、select for update时,总是当前读。快照读什么是快照读:读取的是历史版本,不是最新的数据。何时触发:select

标签:版本  MVCC  

MVCC并发版本控制本文大部分来自《MySQL是怎样运行的》,这里只是简单总结,用于各位回忆和复习。版本链对于使用

标签:重点  版本  MVCC  ReadView  

作者:京东零售  李泽阳最近在阅读《认知觉醒》这本书,里面有句话非常打动我:通过自己的语言,用最简单的话把一件事情讲清楚,最好让外行人也能听懂。也许这就是大道至简,只是我们习惯了烦琐和复杂。希望借助今天这篇文章,能用大白话说清楚这个相对比较底层和复杂的MVCC机制。在开始之前,先抛出一个问题:我们都知道,目前(MySQL 5.6以上)数据库已普遍使用InnoDB存储引擎,InnoDB相对于MyISAM存储引擎其中一个好处就是在数据库级别锁和表级别锁的基础上支持了行锁,还有就是支持事务,保证一组数据库操作要么成功,要么失败。基于此,问题来

标签:一文  版本  mysql  

基础概念 并发事务带来的问题 1)脏读:一个事务读取到另一个事务更新但还未提交的数据,如果另一个事务出现回滚或者进一步更新,则会出现问题。 2)不可重复读:在一个事务中两次次读取同一个数据时,由于在两

标签:源码  

基础概念 并发事务带来的问题 1)脏读:一个事务读取到另一个事务更新但还未提交的数据,如果另一个事务出现回滚或者进一步更新,则会出现问题。 2)不可重复读:在一个事务中两次次读取同一个数据时,由于在两次读取之间,另一个事务修改了该数据&#xf

标签:源码  

一、并发控制概述1.1 定义和基本概念定义: 并发控制是指在多个同时运行的操作或事务中,有效地管理对共享资源的访问,以确保系统的正确性和一致性。在计算机科学和数据库领域,它主要用于处理并发访问共享数据时可能出现的冲突和竞争条件。基本概念:

标签:语法  事务  数据库  

文章目录 nvm下载安装查看目前可用版本安装完之后查看版本查看镜像源与npm所有配置修改镜像源与npm配置安装结束

标签:控制器  

本文分享自华为云社区《java进行数据库操作的并发控制》,作者:张俭。在现代应用编码中,从数据库里面find出来,进行一些业务逻辑操作,最后再save回去。即:Person person = personRepo.findById(id);person.setAge(18);personRepo.save(person);但是这样的业务操作,如果一个

标签:种方法  操作  数据库  java  

文章目录 nvm下载安装查看目前可用版本安装完之后查看版本查看镜像源与npm所有配置修改镜像源与npm配置安装结束

标签:控制器  

Git&GitHub1. 版本控制工具应该具备的功能协同修改多人并行不悖的修改服务器端的同一个文件数据备份不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态版本管理在保存每一个版本的文件信息的时候要做到不包吃重复数据,以节约存储空间,提高运行效率。这方面SVN采用的是销量式管理的方式,而Git采取了文件系统快照的方式。权限控制

标签:版本  git  

版本控制gitlab目录版本控制gitlab版本控制介绍常用的版本控制工具:gitlab部署gitlab网页界面的基本使用使用命令行的方式进行上传文件版本控制介绍版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变

标签:版本  Gitlab  

版本控制gitlab目录版本控制gitlab什么是版本控制gitlabgitlab部署什么是版本控制gitlabGitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。安装方法是参考GitLab在GitHub上的Wiki页面。Gitlab是目前被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过程中产生的代码和文档进行管理, Gitlab主要针对group和project两个维度进行代码

标签:版本  Gitlab  

微博的版本控制还真是问题多多。一时兴起想取消授权某些用微博登录绑定的第三方网站或app,结果根本找不到北!不管是新版还是原版界面。感觉N年前就是在“帐号设置”中,现在没有。搜索了一堆问答、官方客服,@微博客服机器人也是N年前的老答案。在帐号设置、管理中心等等位置,根本没有“我的应用”、“我的工具”。有个“开放平台”,其中“我的应用”和取消绑定不是一回事,是给开发者的。折腾了好久,才在若干爱问的一个答案中找到解决方法:原来得到 应用广场-我的应用 进行操作!这就是传说中代码屎山的外壳表面吗(前端的锅)? 本文来自博客园,作者:supervisor,转载请注明原文链接

标签:版本  

文章目录 更新软件包列表安装MySQL服务器配置MySQL账号密码配置MySQL的统一字符启动MySQL服务允许远程连接Wi

标签:开源  

Promethues Prometheus https://prometheus.io Prometheus是一个开源的服务监控系统,它负责采集和存储应用的监控指标数据,并以可视化的方式进行展示,以便于用

标签:数据库  

文章目录 1.查看目前python的版本2.添加软件源并更新3.选择你想要下载的版本4.警示:没必要设置默认版本误区千万千万不要

标签:版本  

本文分享自天翼云开发者社区《云数据库MySQL多人协同开发实践》,作者:不知不觉随着云计算技术的快速发展,云数据库作为云计算的重要组成部分,为企业提供了高效、灵活和可靠的数据存储和管理服务。其中,MySQL作为一款流行的开源关系型数据库,在云数据库领域具有广泛的应用。多人协同开发是软件开发过程中的重要环节,本文将探讨云数据库MySQL多人协同开发的实践。

标签:数据库  mysql  

二、多表查询 1.创建student和score表 CREATE  TABLE student ( id  INT(10)  NOT NULL  UNIQUE  PRIMARY KEY , name  VARCHAR(20)  NOT NULL , sex  VARCHAR(4) , birth  YEAR, department  VARCHAR(20) , address  VARCHAR(50) ); CREATE  TABLE score ( id  INT(10)  NOT NULL  UNIQUE  PRIMARY KEY  AUTO_

标签:数据库  

猜你喜欢

目录 一、引言 二、锁的类型及作用 2.1 行级锁

标签:机制  

  相信对于每一个开发从事者或一个团队、一家公司都对版本控制管理器都不陌生,接下来我会持续写关于版本控制管理器的相关文章,包括发展史、从古典时期的CVS的介绍到现代火热的Git等版本控制管理器,以及其各自的特点和区别。 本篇文章我会为大家先介绍版本控制管理器的发展史,直接上图:    这张图上分成了四个时期: (1)史前时期

标签:管理器  发展史  版本  

事务隔离级别遗留问题:在读已提交的级别下,事务B可以读到事务A持有写锁的的记录,且读到的是未更新前的,为何写读没有冲突?可重复读级别,事务B可以更新事务A已经获取读锁的记录,且更新后,事务A依然可以获取读锁,为何读-写-读没有冲突?在可重复读级别,幻读没有产生其中,前两个问题就是因为mvcc机制(读锁的一种优化机制),通过不加读锁,避免读写冲突,进而提高了性能。而第三个问题,一部分原因是由MVCC机制保证的,还有一部分则是由锁来保证的;在学习了解MVCC机制中遇到的问题:

标签:源码  机制  mysql  MVCC  

分支 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着可以把工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。 查看本地分支

标签:分支  

版本控制系统(Version Control System,VCS)是软件开发过程中用于管理源代码的工具。它可以帮助你跟踪代码的变更历史,方便回滚到之前的版本,以及协同多人共同开发。Git是当前最流行的版本控制系统之一,我们将以Git为例,介绍版本控制的基本概念和操作。10.5.1. Git基本概念在Git中,主要有以下几个基本概念:仓库(Repository):仓库是用来存储项目代码的地方,包含了项目的所有文件和文件的变更历史。提交(Commit):提交是对文件的一次修改,每次提交都会生成一个唯一的

标签:版本  git  

目录 1、什么是 Git 2、Git的特性 2.1 Git与SVN 的差异比较

标签:控制系统  

起因: 因工作需要,在本机测试环境升级mysql数据库,需逐条执行mysql数据库的sql文件对数据库进行升级,因此找了些关于mysql的文章,对批量升级数据库所需的sql文件进行升级。整理思路:首先,需要对所需升级的sql所在目录的sql文件进行遍历。生成新的批量执行sql文件。想到是windows系统安装的mysql,首先想到使用bat进行sql文件的生成;生成sql文件后,还需要使用bat文件连接到数据库,并使用新生成的sql文件进行升级。想到升级的过程中还有可能字符集出现问题,因此需要使用cmd登陆mysql控制台,对编码进行查

标签:数据库  批量  版本  操作  文件  

##########################今天来说一下MySQL数据库的一些基本操作##########################

标签:操作  数据库  mysql  

1.创建数据库  CREATE DATABASE database_name2.删除数据库  DROP DATABASE database_name3.选择数据库  USE database_name4.数据类型(1)数值类型

标签:基本知识  数据库  mysql  

MySQL 数据库备份脚本#!/bin/bash# 数据库连接信息DB_HOST=127.0.0.1DB_PORT=3306DB_USER=rootDB_PASSWD=root# 时间格式化,如 20211216DATE=`date +%Y%m%d`# 备份文件目录DIR_BACKUP=${HOME}/data/db-backup# 日志目录: ${HOME}/data/db-backup/logsDIR_LOG=${DIR_BACKUP}/logs# 日志文件: ${HOME}/data/db-backu

标签:脚本  备份  数据库  mysql  

 摘要版本格式:主版本号.次版本号.修订号,版本号递增规则如下:主版本号:当你做了不兼容的 API 修改,

标签:版本  语义  规则  

文章目录 下载MySQL安装重置密码本地连接 下载MySQL 下载网址:https://dev.mysql.com/down

标签:详解  

主分支,命名为master,版本分支发版后合并到该分支,只有生产部署权限可以合并其它分支到该分支;版本分支,命名为release_版本号_发版时间,从master创建,版本发布使用,版本发布前或者发布后打tag标签,也可以不打标签看自己,版本发布后合并代码到master。功能分支,命名为feature_[需求编号|任务编号],从版本分支创建,每个功能分支对应一个需求。功能分支是开发人员使用的分支,开发人员的代码提交到功能分支后,在合并到版本分支之前先把版本分支代码合并一次到自己的功能分支,然后再合并到版本分支。

标签:版本  经验  

一、版本控制 版本控制(Revision contontrol)是一种在开发过程中用于管理修改历史,方便查看更改历史记录,备份以便恢复以前版本的软件工程的技术。1.实现跨区域多人协同开发 2.追踪和记载一个或者多个文件的历史记录 3.组织和保护你的源代码和文档 4.统计工作量 5.并行开发,提高效率 6.跟踪记录整个软件的开发过程 7.减轻开发人员的负担,节省时间,同时降低人为错误 用于管理多人协同开发项目的技术 

标签:控制器  版本  git  

版本控制是创建和管理软件产品多个版本的方法。它能帮助用户根据自己的需求来决定使用哪个版本。这种方法同样适用于 API 。API 的创建基于使用者和开发者共同的需求。它像其他传统的软件产品一样,随着时间的推移而发展,需要不断地迭代更新。通过下面的例子,我们可以更好地理解什么是 API 版本控制。假设一个场景,我们希望开发者能够访问客户信息,并且可以通过创建 API 来提供所需的功能。而作为初始版本,我们可以提供只有读取客户信息权限的 API 。然而随着应用程序需求的增加,开发者会增加对客户信息的写入或者访问权限等更深层次的功能进行迭代更新。作为开发者,需要确定的有:1、是否需要提供能写入客户信

标签:版本  API  Eolink  

shell脚本-MySQL数据库备份准备:确保mysql服务启动可以通过mysqldump命令来备份数据库1.mysqldump 命令语法:使用 mysqldump 命令备份一个数据库的语法格式如下:mysqldump -u username -p dbpasswd [tbname ...]> filename.sql使用 mysqldump 命令备份一个数据库中表的语法格式如下:mysqldump

标签:脚本  备份  数据库  Shell  mysql  

​1、概念mvcc作用在于解决并发条件下,读写冲突的问题。一般用于RC和RR隔离级别,解决脏读和不可重复读的问题。(1)当前读读取的是记录的最新版本,读取时还要保证其他事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select ... lock in share mode(共享锁),select ... for update、update、insert、delete(排他锁)都是一种当前读。(2)快照读简单的select 就是快照读,读取的是记录的可见版本, 有可能是历史数据,不加锁,不阻塞Read Committed:每次select,都会生

标签:mysql  MVCC  

目录 一. 前言 二. 认识 MVCC 2.1. 什么是 MVCC? 2.2. 什么是当前读和快照读? 2.3. 当前读、快照读和 MVCC 的关系 2.4. MVCC 能解决什么问题,好处是什么?

标签:详解  

语义化版本控制(semantic versioning),通常表示为:主版本号.次版本号.修订号,即 major.minor.patch。下面是每个组成部分的含义和例子: major版本:当你做了不兼容的api更改,即那些会破坏现有用户的代码更改时,你需要增加主版本号。例如,从 1.6.3 更新到 2.0.0 表示有重大更改,现有的用户可能需要修改他们的代码才能适应新版本。 minor版本:当你添加了新功能,但是以向后兼容的方式,即不会破坏现有功能时,你需要增加次版本号。例如,从 1.6.3 更新到 1.7.0 表示添加了新功能,但是现有的用户代码不会受影响。 patch版本:当你

标签:语义  版本  Dec  

https://www.cnblogs.com/yeungchie/soscmd创建工作区soscmd newworkarea $serverName $projectName [$path]常用这种soscmd newworkarea SERV1 PRJ1 -here -lmian -LCACHED在当前路径下,启用cache,

标签:版本  笔记  工具  SOS  

Mysql主从环境概述Mysql集群主从环境搭建

标签:主从  实战  实例  版本  数据库  

Mysql主从环境概述Mysql集群主从环境搭建

标签:主从  实战  实例  版本  数据库  

Mysql主从环境概述Mysql集群主从环境搭建本次采用

标签:主从  实战  实例  版本  数据库  

题目: 创建职工表以及职工工资表职工表字段:工号,姓名,性别,年龄工资表字段:编号自增,职工工号,基础工资10000通过触发器实现:

标签:触发器  

简介 🍀通过依赖注入的方式,使用ORM工具Entity Framework查询Mysql数据库中的数据,并实现多表联查 假设我们有一个user用户表,其中occupationid对应的就是下面职业表中的id  职业表Occupations  

标签:如何使用  

相关问题

相关文章

热门文章

推荐文章

相关标签