MVCC原理详解

MVCC 底层原理详解 大家好 我是积极向上的湘锅锅💪💪💪 满满的干货 欢迎点赞关注收藏🔥 🔥 🔥顾名思义,读取的就是当前最新的版本,而且读取的时候保证其他并发事务不会修改该记录,会对记录加锁(共享锁或者是排它锁),如:select … lock in share mode(共享锁),select … for update、update、insert、delete(排他锁)都是一种当前读简单的 select(不加锁)就是快照读,快照读读取的可能是最新版本,也有可能是历史数据Read Committed:每个select...... 阅读详情

目录

一、思考

二、原理

MVCC原理

1、MVCC原理是什么?

2、为什么可重复度隔离级别下,没有“不可重复度”的问题?

3、ReadView介绍

4、Undo Log

5、举例

6、MVCC解决了幻读问题吗?

一、思考

1、事务是什么?为什么要有事务?事务的4个基本要素是什么?并发时会有什么问题?

2、由于并发时会存在问题,不能保证事务的4个基本要素,所以有了四个隔离级别。

3、但是四个隔离界别是怎么实现的呢?可以通过锁来实现,但是加锁会导致数据库性能的降低(读数据时,没办法修改,修改数据时,没办法读取)。那怎么办?能不能不加锁?

答案就是MVCC(多版本并发控制)通过对数据做多版本管理,通过保存数据的历史版本,根据比较数据的版本号来决定数据的是否显示,避免加写锁而导致阻塞,造成写数据时无法读取数据的问题。

二、原理

1、了解原理前,得知道mysql中什么是快照读?什么是当前读?

  • 快照读:读取的是快照数据,不加锁的简单 Select 都属于快照读
SELECT * FROM t_user WHERE ...
  • 当前读:当前读就是读的是最新数据,而不是历史的数据,加锁的 SELECT,或者对数据进行增删改都会进行当前读。
SELECT * FROM player LOCK IN SHARE MODE;
SELECT FROM player FOR UPDATE;
INSERT INTO player values ...
DELETE FROM player WHERE ...
UPDATE player SET ...

2、首先确认一点MVCC属于快照读的,在进行快照读的情况下是不会对数据进行加锁。

  • 当前读的情况下,mysql可重复读隔离级别,通过间隙锁+ 临键锁来解决幻读问题。
  • 快照读的情况下,mysql可重复读隔离级别,通过MVCC解决的幻读问题。

MVCC原理

1、MVCC原理是什么?

InnoDB 实现MVCC,是通过Read View + Undo Log 实现的,Read View可见性规则帮助判断当前版本的数据是否可见,Undo Log 保存了历史快照。如果要查看的事务对应的数据,在Read View可见效规则判断不可见,则通过Undo Log保存的历史快照进行查询。

2、为什么可重复度隔离级别下,没有“不可重复度”的问题?

在可重复读(RR)隔离级别下,同一个事务里面,只会在开始时获取一次read view,后面都是共用同一个read view,从而保证每次查询的数据都是一样的。即:没有不可重复读问题。

在读已提交(RC)隔离级别下,同一个事务里面,每一次查询都会产生一个新的Read View副本,这样就可能造成同一个事务里前后读取数据可能不一致的问题(即:不可重复读并发问题)。

3、ReadView介绍

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

如何进行可见效判断呢?

  • m_ids:当前系统中那些活跃(未提交)的读写事务ID, 它数据结构为一个List。
  • min_limit_id:表示在生成Read View时,当前系统中活跃的读写事务中最小的事务id,即m_ids中的最小值。
  • max_limit_id:表示生成Read View时,系统中应该分配给下一个事务的id值。
  • creator_trx_id: 创建当前Read View的事务ID
  1. 如果数据事务ID trx_id < min_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。

  2. 如果trx_id>= max_limit_id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。

  3. 如果 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生成之前就已经提交了,修改的结果,当前事务是能看见的。

4、Undo Log

作用:主要用于记录数据被修改之前的日志,在表信息修改之前先会把数据拷贝到undo log 里,当事务进行回滚时可以通过undo log 里的日志进行数据还原。

5、举例

a、原始数据

b、事务执行过程,MVCC原理

6、MVCC解决了幻读问题吗?

结论:MVCC本来就是对mysql不加锁的优化,快照读的情况下可以避免幻读问题,在当前读的情况下则需要使用间隙锁来解决幻读问题的。

举例:

1、快照读

在使用快照读的时候,数据是可以插入成功的,那这也就说明了一个问题,快照读的时候就根本没加锁,否则的话数据是不可能插入成功的,而且在插入数据提交成功后,我们执行第二条查询 语句是读取不到中间插入的这条数据的,这也就说明在没有加锁的情况下,基于历史版本的MVCC快照读是可以避免幻读问题的。

2、当前读

当前读的话就不同了,当前读每次都会读取最新的数据。所以两次读取中间如果可以插入数据(实际上另一个事务会因为前一个事物有锁的存在而阻塞住),那么就肯定会造成幻读问题,所以在当前读的情况下就必须通过一种方式来解决幻读问题,而这种方式就是采用加锁来解决。

例如:首先关闭数据库的自动提交事务功能, 使用当前读的方式演示和上面一样的流程,结果发现在当前读的时候没有提交事务之前是根本无法进行数据插入的,所以这也就说明了,使用当前读的时候会对这个范围内的数据进行加锁,所以无法在查询的范围内进行数据插入,这无疑也证明了在当前读的情况下mysql是使用锁的机制来避免出现重复读和幻读问题的。

比如:以下这种情况,就会有幻读问题。

因为事务A开始是快照读,没加锁,所以事物B没阻塞提交了。事务A执行更新时是当前读,自然可以进行数据读取。

详情看下面的文章

参考文章:

MVCC 原理-阿里云开发者社区

看一遍就理解:MVCC原理详解-技术圈

数据库基础(四)Innodb MVCC实现原理 - 知乎

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

相关推荐

mysql mvcc 原理详解

mysql mvcc原理解读

congge 4717

mysql中MVCC多版本并发控制原理的详解

今天我们分享mysql中MVCC多版本并发控制原理的详解 一、MVCC定义 1、MVCC简介 MVCC,全称Multi-Version Concurrency Control,即多版本井发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 MVCC在MysQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突。做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。 2、当前读 像select lock in sha.

nandao158的博客 1万+

ZYNQ 系统的IEEE1588 实现方法

zynq IEEE588/PTP 实现方案(讨论稿)

姚家湾博客 1万+

MVCC原理讲解(深入浅出)

从以上的描述中我们可以看出来,所谓的MVCC指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。

qq_54421200的博客 5669

DIY T12烙铁头驱动难题:用几个电容二极管,搞定NMOS上管驱动(附Multisim仿真)

本文详细介绍了如何利用电荷泵电路解决DIY T12烙铁头驱动中的NMOS上管驱动难题。通过巧妙组合电容和二极管,构建低成本高效的升压电路,实现栅极高压驱动需求。文章包含具体电路设计、元件选型建议、实际搭建注意事项以及Multisim仿真验证,为电子爱好者提供了一套完整的解决方案。

weixin_33640562的博客 334

python DEA: 基于非径向距离NDDF的Malmquist-Luenberger 指数及其分解

点赞发Nature 关注中Science Malmquist-Lenberger指数(ML指数)是距离函数与DEA计算中常用的指数,ML指数可以进一步分解为技术进步technological progress和效率改善effeciency change. 技术进步常被当做增长模型中的全要素生产率,用到许多计量经济研究中,探讨影响技术进步的环境变量。这里我分享一个考虑非期望产出下的NDDF方法计算ML指数。 该ML指数为global ML(区别于sequential ML) import numpy as

Cmmmmm丶的博客 5297

MVCC实现原理

1、什么是MVCC mvcc多版本并发控制。 mvcc在mysql innodb中主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加索,非阻塞并发读。。 2、实现原理: mvcc的实现是通过保存数据在某个时间点的快照来实现的。也就是说不管需要执行多长时间,每个事物看到的数据都是一致的。 3、mvcc解决那些问题? 事务并发可能会产生以下问题: 脏读:读取其它事务未提交的数据。 不可重复读:一个事务在读取一条数据时,由于另一个事务修改了这条数据并且提交

南国樱花祭 8085

高分思路!挑战7天完成一篇网状meta DAY1-7

PASSION!继续析挑战,7天完成一篇网状meta分!

MR_SCI_help的博客 786

MySQL之MVCC原理详解

MVCC详解

KKK 1万+

项目经理面试 5 大高频题 + 实战回答模板,帮你稳拿 offer

项目经理面试5大高频问题及应答技巧 摘要:本文总结了项目经理岗位常见的5个面试问题及回答策略,帮助求职者更有针对性地准备面试。核心问题包括:1)描述负责过的典型项目;2)常用项目管理工具;3)项目遇到的挑战及解决方案;4)风险管理方法;5)项目成功标准。每个问题都从面试官考察重点、回答技巧、实战案例三个维度进行分析,强调要用STAR法则(情境-任务-行动-结果)结构化表达,突出解决问题的能力而非简单罗列经历。特别提醒要量化项目成果(如提前2周上线、节省8%预算等),并注意展示商业思维和团队协作能力。

逸尘谈PM 2105

【100%通过率】华为OD机试真题 C 实现【最多等和不相交连续子序列】【2022.11 Q4 新题】

给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。求一组连续子序列,组内子序列的数目最多。输出这个数目。

MISAYAONE的博客 1万+

MySQL MVCC底层原理详解

MySQL MVCC底层原理详解

天瑕的博客 2万+

在 SAP Fiori 中正确配置 Group 角色:从 PFCG 分配到首页呈现的完整链路

摘要:SAP Fiori项目中,用户登录后能否看到应用往往取决于角色配置而非前端开发。关键在于通过PFCG角色将launchpad designer中创建的tile group关联到用户角色。Catalog是应用池,group是用户首页可见的工作区。正确配置后,用户会看到角色对应的默认分组,同时保留个性化调整能力。项目实施中常见问题是应用开发完成但未正确配置group与角色关联,导致业务用户无法在首页看到应用入口。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

【数据库】MVCC原理详解

MVCC实现原理是一道非常高频的面试题,最近技术讨论群的小伙伴一直在讨论,趁着五一假期有空,我们一起来聊聊。事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。假如A转账给B 100 元,先从A的账户里扣除 100 元,再在 B 的账户上加上 100元。如果扣完A的100元后,还没来得及给B加上,银行系统异常了,最后导致A的余额减少了,B的余额却没有增加。所以就需要事务,将A的钱回滚回去,就是这么简单。为什么要有事务呢?就是为了保证数据的最终一致性。

DreamSun的博客 9867

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mvcc原理详解

前提:在介绍mvcc之前,先简单介绍一下mysql事务的相关问题,mvcc归根结底是用来解决事务并发问题的,当然这个解决不是全部解决,只是解决了其中的一部分问题! mysql事务 一、事务的基本要素(ACID)   1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。    2、一致性(Consistenc

qianghaiyang的博客 2438

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

⛳ MVCC 原理详解

事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。假如 A 转账给 B 100 元,先从 A 的账户里扣除 100 元,再在 B 的账户上加上 100 元。如果扣完 A 的 100 元后,还没来得及给 B 加上,银行系统异常了,最后导致 A 的余额减少了,B 的余额却没有增加。所以就需要事务,将 A 的钱回滚回去,就是这么简单。为什么要有事务呢?就是为了保证数据的最终一致性。MVCC 是 写时复制(copy on writer)思想的一种体现。

松柏123的博客 1122

【MySQL】MVCC详解与MVCC实现原理(MySQL专栏启动)

本文是:MySQL事务隔离机制与实现原理详解,的深入学习,我们在了解MySQL事务隔离机制与实现原理后,了解什么是MVCC,MVCC的实现原理,最后辨析当前读和快照读与MVCC和事务隔离的关系,更加全面和深入的MySQL事务隔离机制。

小明的Java问道之路 6668

MySQL:MVCC原理详解

MySQL是允许多用户同时操作数据库的,那么就会出现多个事务的并发场景。的问题。而解决这些问题所用到的方法就是:MVCC 多版本并发控制。而这个MVCC的实现是基于read view是一个数据库的内部快照,它记录了数据库在的数据信息。read view用于实现事务的隔离性,即在并发事务中,一个事务能看到哪些数据,以及哪些数据对其他事务不可见。read view的和事务的隔离级别有关,例如,在隔离级别下,read view会在生成,而在隔离级别下,read view会在执行时生成。

qq_64680177的博客 1216

mysql的mvcc实现原理详解_MYSQL MVCC实现原理详解

MVCC(Multi Version Concurrency Control的简称),代表多版本并发控制。与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。MVCC最大的优势:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能了解MVCC前,我们先学习下Mysql架构和数据库事务隔离级别MYSQL...

weixin_32098599的博客 184

【MySQL】MVCC详解与MVCC实现原理

MVCC,全称 Multi-Version Concurrency Control ,MVCC是多版本并发控制的全称,是指多版本的并发控制。MVCC是一种并发控制方法。通常,在数据库管理系统中,它用编程语言实现对数据库和事务存储器的并发访问。MVCC 是一种在读取数据时无需锁定(加锁)即可提高读取效率和并发性的方法。数据库并发有以下情况:1、读-读:没有问题。2、读-写:存在线程安全问题,这可能导致脏读、幻读和不可重复读。3、写-写:存在线程安全问题,更新可能会丢失。这里面讲解了,事务的特性、事务的隔离级别

Huangjiazhen711的博客 425

mysql mvcc_MYSQL MVCC实现原理详解

MVCC(Multi Version Concurrency Control的简称),代表多版本并发控制。与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。MVCC最大的优势:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能了解MVCC前,我们先学习下Mysql架构和数据库事务隔离级别MYSQL...

weixin_29420421的博客 238

Mysql之MVCC原理详解,看这一篇就够了

很多老铁讲到MVCC只知道版本链,但是像ReadView、包括和UndoLog的关系就不太理解了,接下来就详细给大家讲讲Mysql跟MVCC的那些事。最近打算跳槽面试的请收藏好!

m0_68103752的博客 3663

详解Mysql的MVCC实现原理

MVCC是一种InnoDB引擎独有的一种控制事务隔离级别的机制,通过巧妙的设计处理写-读冲突,避免加锁造成的性能损耗,提高了数据库的并发性能

2301_76632762的博客 2206
上一篇: 短视频场景高并发技术实现
下一篇: 常见限流算法
九号铅笔芯
博客等级 码龄9年 9粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值