Mysql -MVCC多版本并发控制机制

MySQL之MVCC机制:为什么你改了的数据我还看不见? MVCC多版本并发控制,听起来似乎蛮高大上的,但实际研究起来会发现它并不复杂,其中的多版本主要依赖Undo-log日志来实现,而并发控制则通过表的隐藏字段+ReadView快照来实现,通过Undo-log日志、隐藏字段、ReadView快照这三玩意儿,就实现了MVCC机制,过程还蛮简单的。 阅读详情

什么是MVCC

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

MVCC的作用

  • Mysql在可重复读隔离级别下如何保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。undo日志版本链与read view机制详解undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链(见下图,需参考视频里的例子理解)在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。版本链比对规则:1. 如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的;2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若row 的 trx_id 就是当前自己的事务是可见的);

小结:mvcc就是为了不频繁使用乐观锁、悲观锁 对数据库加锁,影响性能的方式去解决 读 - 写 问题 从而提出的解决方案

  • mvcc版本比对 是使用undo日志版本链与read view机制

    undo日志版本链与read view机制详解

undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链(见下图,需参考视频里的例子理解)在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。

版本链比对规则:

  1. 如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的;
  2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若row 的 trx_id 就是当前自己的事务是可见的);
  3. 如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况 a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务是可见的); b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。对于删除的情况可以认为是update的特殊情况,会将版本链上最新的数据复制一份,然后将trx_id修改成删除操作的trx_id,同时在该条记录的头信息(record header)里的(deleted_flag)标记位写上true,来表示当前记录已经被删除,在查询时按照上面的规则查到对应的记录如果delete_flag标记位为true,意味着记录已被删除,则不返回数据。注意:begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个修改操作InnoDB表的语句,事务才真正启动,才会向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的。
    总结:MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。

在这里插入图片描述

MVCC还涉及到RR、RC等相关问题

在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。

MySQL事务详解结合MVCC机制的理解 所谓的MVCC(Muti-Version Concurrency Control,多版本并发控制)指的是 在read-commited和repeatable-read两个事务隔离级别的事务,在执行普通的SELECT操作的时候,访问的就是版本链的过程。至于为什么repeatable-read能防止多次读结果不一致,是因为事务发生第一次读的时候,就会选定要读取的数据行版本,整个事务内,都读取这个选定好的版本行,不会因为另一个并发事务提交了新的版本行就去选择它。第一个连接在同一事务内,读取到的数据也是一样的。 阅读详情

相关推荐

《MySQL》第十篇 MVCC与BufferPool缓存机制

一. MySQL事务隔离级别 二. 锁机制 一. MySQL事务隔离级别

入坑太深起不来 1002

MySQL(二): 事务的隔离性原理

mvcc是什么,事务如何保证可见行,undolog,事务的隔离性

qq_37805943的博客 518

07-VIP-深入理解MVCC与BufferPool缓存机制.pdf

07-VIP-深入理解MVCC与BufferPool缓存机制.pdf

深入理解MVCC与BufferPool缓存机制

一、MVCC多版本并发控制机制 MySql在可重复读隔离级别下如何保证事务较高的隔离性,我们上篇文章中提到过,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。 这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。 Mysql在读已提

沮丧的南瓜 559

JS逆向-快手__NS_hxfalcon参数分析

现在快手H5接口都需要__NS_hxfalcon这个参数,这篇文章就是逆向这个参数

ckcookies的博客 4075

手把手教你用Wireshark抓包分析Profinet非周期通信(附实战案例)

本文详细解析了PROFINET非周期通信(RTA)的技术原理与实战应用,通过Wireshark抓包分析,揭示从PLC请求到驱动器响应的完整对话过程。涵盖实验环境搭建、关键配置步骤、典型参数访问流程及故障诊断案例,帮助工程师深入理解并优化工业网络通信性能。

Black的专栏 1049

MySQL MVCC多版本并发控制机制原理详解

MySQL在读已提交和可重复读隔离级别下都实现了MVCC机制,MySQL在可重复读隔离级别下如何保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。这个隔离性就是靠机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。

kerwin的博客 7326

Visual Studio 2013 + Intel(R) Visual Fortran 安装教程

安装了好几遍,ivf都不能加载到vs中,中途放弃了vs,又改用codeblocks编译器,依然在写fortran的时候出现了各种问题,于是又放弃了codeblocks改回vs,总之是折腾了好久,终于装明白了ivf并且将fortran模板成功加载到vs中。 PS:一定要安装Intel Visual Fortran.Composer XE.2013-SP1,不要用Intel Visual Fortr...

Coco_wjy的博客 12万+

MySQL多版本并发控制机制(MVCC)实现原理与源码分析

作为一个数据库爱好者,动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。不能让你玩转某个真正的数据库。在mac上用xcode去debug MySQL,从而能去了解它的各种实现细节。(注:本文的MySQL采用的是MySQL-5.6.35版本)MySQL为了兼顾性能和ACID使用了大量复杂的机制,2PL(两阶段锁)和MVCC就是其实现的典型。幸好可以通过xcode等IDE进行方便的debug,这样就可以非常精确加便捷的追踪其各种机制的实现。

深入Java世界:探索编程之美与技术深度 846

ADRC自抗扰PD+ESO控制(博途SCL源代码)

文章浏览阅读119次。线性自抗扰控制(LADRC)系统算法框图-优快云博客文章浏览阅读335次。NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。ADRC自抗扰PD+ESO控制(CODESYS测试+完整ST代码)-优快云博客。

RXXW_Dor的博客 1316

Spine骨骼动画查看器 - Skeleton Viewer

骨骼动画是现代游戏和动画制作中常用的技术之一。Spine骨骼动画查看器(Skeleton Viewer)是一个官方提供的工具,用于查看和调试Spine骨骼动画。本文将介绍Skeleton Viewer的功能和使用方法,并提供相应的源代码示例。通过Skeleton Viewer,开发者可以直观地查看和调试Spine骨骼动画,包括骨骼结构、动画播放和事件触发等。这有助于提高骨骼动画的质量和效果,并加速开发过程。以上代码演示了如何使用Skeleton Viewer查看和播放Spine骨骼动画。

HsvvDatabase的博客 3461

Mysql的多版本并发控制机制MVCC

MySQL的MVCC机制 1、MVCC简介 1.1 MVCC是什么? MVCC,Multi-Version Concurrency Control,多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问; 1.2 MVCC是为了解决什么? 大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁...

大白菜的博客 211

影楼精修-AI追色算法解析

本文解析了像素蛋糕软件中AI追色功能的技术原理与实现方案,为理解AI追色技术提供了实用参考。

Trent1985的专栏 2万+

MySQL: 多版本并发控制机制MVCC

MVCC是一种多版本并发控制(Multi-Version Concurrency Control)机制。大多数的MYSQL事务型存储引擎如:InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制。事实上,他们都和MVCC多版本并发控制来一起使用。大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开...

sayoko06的博客 425

大数据架构中的数据治理:元数据管理与数据血缘追踪实践

本文将聚焦大数据架构中数据治理的两大核心支柱——元数据管理与数据血缘追踪元数据管理的目标、类型与实施步骤(从需求分析到工具落地);数据血缘追踪的技术实现(静态解析、动态捕获、混合方案)与应用场景;如何将两者结合,构建完整的数据治理体系,并通过真实案例展示落地效果。元数据管理:定义了业务/技术/操作元数据,讲解了工具选型(如Apache Atlas)、采集(Hook/API)、存储(关系库+图数据库)、应用(数据发现、质量监控);数据血缘追踪。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 868

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MySQL多版本并发控制(MVCC)机制深入解析

在现代数据库应用系统中,高并发是核心需求之一。多个事务同时访问和修改相同的数据时,如果缺乏有效的并发控制机制,就会导致一系列严重问题

一起探索IT的世界 1076

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Mysql MVCC多版本并发控制机制

MVCC(Multi-Version Concurrency Control)机制

个人博客 320

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深入理解 MySQL MVCC:多版本并发控制的核心机制

MySQL MVCC 是一种先进的并发控制技术,它通过维护多个版本的数据来实现非阻塞的读操作,提高了数据库的并发性能和事务隔离性。本文详细介绍了 MVCC 的概念、原理、实现方式、优势、应用场景以及注意事项,并通过示例进行了说明。在实际应用中,我们需要根据具体的业务需求和性能要求,选择合适的事务隔离级别,并注意版本链长度的控制和性能优化,以充分发挥 MVCC 的优势,提高数据库的性能和可靠性。

果酱 の 博客 2225

mysql mvcc 并发update_MySQL——MVCC--多版本并发控制机制

前言以下的分析均在mysql的InnoDB引擎下。假设此时事务A与事务B同时执行。一、定义:MVCC(Multi-Version Concurrency Control,多版本并发控制)一种并发控制机制,在数据库中用来控制并发执行的事务,控制事务隔离进行。二、核心思想:MVCC是通过保存数据在某个时间点的快照来进行控制的。使用MVCC就是允许同一个数据记录拥有多个不同的版本。然后在查询时通过添加相...

weixin_30750349的博客 1337

mysql版本 mvcc_MySQL多版本并发控制机制(MVCC)-源码浅析

MySQL多版本并发控制机制(MVCC)-源码浅析前言作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。<>诚然讲的非常透彻,但只能提纲挈领,不能让你玩转某个真正的数据库。感谢cmake,能够让我在mac上用xcode去debug MySQL,从而能去领略它的各种实现细节。 笔者一直对数据库的隔离性很好奇,此篇博客就是我debug MySQL过程中的...

weixin_28730403的博客 155

MySQL-MVCC多版本并发控制机制

MySQL-MVCC多版本并发控制机制MVCC多版本并发控制机制undo日志版本链与read view机制详解Innodb引擎SQL执行的BufferPool缓存机制 引用自图灵,用于学习。 MVCC多版本并发控制机制 Mysql在可重复读隔离级别下如何保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。 这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一

yz_ylfc的博客 291

mysql mvcc 并发update_MySQL多版本并发控制机制(MVCC)-源码浅析

MySQL多版本并发控制机制(MVCC)-源码浅析前言作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。<>诚然讲的非常透彻,但只能提纲挈领,不能让你玩转某个真正的数据库。感谢cmake,能够让我在mac上用xcode去debug MySQL,从而能去领略它的各种实现细节。笔者一直对数据库的隔离性很好奇,此篇博客就是我debug MySQL过程中的偶...

weixin_33915387的博客 484

深入浅出 MySQL 的 MVCC:多版本并发控制的工作机制与应用

MySQL的MVCC机制通过保存数据历史版本实现高并发事务处理。核心是通过隐藏字段(DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID)实现版本控制,不同隔离级别下表现不同。MVCC优点是读不阻塞写、避免锁竞争、支持快照读,但存在存储开销和幻读问题。其实现依赖UndoLog、ReadView和Purge机制,并与锁机制协同工作。该机制大幅提升了数据库并发性能,理解MVCC有助于优化事务设计和SQL查询。

pangHu很菜 960

MySQL多版本并发控制机制(MVCC)-源码浅析

前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。<<事务处理-概念与技术>>诚然讲的非常透彻,但只能提纲挈领,不能让你玩转某个真正的数据库。感谢cmake,能够让我在mac上用xcode去debug MySQL,从而能去领略它的各种实现细节。 笔者一直对数据库的隔离性很好奇,此篇博客就是我debug MySQL过程中的偶有所得。 (注:本文的MySQL采用的是MySQL-5.6.35版本) MVCC(多版本并发控制机制) 隔离性也可以

小梦爱Java的博客 513
上一篇: 学习设计模式之工厂模式
下一篇: 数据结构与算法-基础数据结构:数组练习
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值