学习总结与分享-MySQL的MVCC(多版本并发控制)浅析

实战指南:用Python实现ONVIF WS-Discovery设备发现(附完整代码) 本文提供了一份详细的实战指南,介绍如何使用Python实现基于ONVIF标准的WS-Discovery设备发现协议。文章深入解析了协议原理、网络通信模型,并提供了完整的代码实现,帮助开发者快速构建智能安防和物联网应用中的设备自动发现工具,有效提升网络设备集成管理的效率。 阅读详情

我们在平时编码操作数据库时,通常会有一个事务A读取一行数据,而又有另一个事务B需要写同一条数据,而为了保证事务A在每次读取时保持一致性和原子性,在传统的事务的锁机制下,这肯定是不允许的,事务B需要等待事务A执行结束后才可以执行,而当类似的需求并发过多的时候,就很容易产生锁阻塞、死锁或者事务一直在等待执行过慢导致报错等等情况,所以数据库就使用了MVCC这个概念来解决事务在并发下的效率问题。
什么是MVCC?
摘自百度百科:Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。
也可将MVCC看成行级别锁的一种妥协,它在许多情况下避免了使用锁,同时可以提供更小的开销。根据实现的不同,它可以允许非阻塞式读,在写操作进行时只锁定必要的记录。所以这也意味着MVCC都是针对于行级锁来进行的。
但是MySQL数据库的InnoDB引擎所用MVCC概念并不是真正的MVCC,InnoDB只是借了MVCC这个名字,提供了读的非阻塞而已
理想MVCC与InnoDB的MVCC:
MVCC有下面几个特点:
每行数据都存在一个版本,每次数据更新时都更新该版本
修改时Copy出当前版本随意修改,各个事务之间无干扰
保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)
就是每行都有版本号,保存时根据版本号决定是否成功,听起来含有乐观锁的味道,而InnoDB的实现方式是:
事务以排他锁的形式修改原始数据
把修改前的数据存放于undo log,通过回滚指针与主数据关联
修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback)
二者最本质的区别就在于在修改时是否使用排他锁。而说到了InnoDB的MVCC,就必然要提到上面说的undo log,这就又涉及到了MySQL的存储机制,其中不仅仅有undo log,还有redo log来控制数据的commit。

undo log 与 redo log:
redo log:
事务中所有操作会先写到redo log中,然后再同步到数据库文件中。所以数据库文件进行事务操作修改时,redo log肯定已经记录了所有事务操作,此时即使数据库挂掉,事务操作也都已经持久化到redo log中了,数据库恢复后可以继续执行剩下操作。
redo log有两部分组成,redo log buffer与redo log file。如果每个事务的redo log都实时写到file中,再写到数据文件中,那么性能会比较差,所以可以先把一定时间间隔中的事务操作记录到buffer中,然后统一刷新到file中(此时数据库文件的刷新不一定晚于重做日志文件的刷新)。
redo log使用buffer缓存,丢失了数据持久性,数据库宕机时,没有持久化到redo log file中的事务操作也会丢失。此时数据库数据需要回滚到这些丢失事务之前的状态,undo log正好记录了事务之前的状态。
也就是说在一个事务中的每一次SQL操作之后都会写入一个redo log到buffer中,在最后COMMIT的时候,必须先将该事务的所有日志写入到redo log file进行持久化(这里的写入是顺序写的),待事务的COMMIT操作完成才算完成。
在这里插入图片描述
undo log:
undo log记录了事务提交之前的数据状态。所以当事务操作同步到数据文件仅仅执行了一半就失败了,恢复后无法找到剩余事务操作,那就只好回滚到事务执行前了。这是就可以使用undo log了。
不同于redo log存放在单独文件中,undo log存放在数据库内部特殊的段中(undo segment),这个段位于共享表空间中。可以知道,undo log必然发生在事务执行之前,所以事务操作执行开始了,undo log必然已经存在了。
那么每个事务如果需要回滚,数据库如何确定undo log的数据存储在哪里呢,又是如何准确的回滚呢。这里就需要说到一些隐藏的字段:
DB_TRX_ID:最近更改该行数据的事务ID。
DB_ROLL_PTR:undo log的指针,用于记录之前历史数据在undo log中的位置。
在这里插入图片描述
大体知道了MySQL的存储机制和过程了之后,那又是怎么根据undo log来实现mvcc的呢,简单来说就是根据每个事务的ID也就是版本号存入undo log对应的位置中,每次读的时候都会读取自己版本相应数据,而当其他事务在修改该条记录或新增区间的记录后,读取的事务再次读取时也会根据活跃的事务的版本数组来计算,从而还是只读自己当前事务的数据,所以MySQL的事务在重复读的隔离级别下,由于MVCC的关系,也已经解决了幻读的问题。下面介绍一下具体的实现原理
MySQL的MVCC实现原理:
可见性比较算法(这里每个比较算法后面的描述是建立在rr级别下,rc级别也是使用该比较算法,此处未做描述)
设要读取的行的最后提交事务id(即当前数据行的稳定事务id)为 trx_id_current
当前新开事务id为 new_id
当前新开事务创建的快照read view 中最早的事务id为up_limit_id, 最迟的事务id为low_limit_id(注意这个low_limit_id=未开启的事务id=当前最大事务id+1)
比较:
1.trx_id_current < up_limit_id, 这种情况比较好理解, 表示, 新事务在读取该行记录时, 该行记录的稳定事务ID是小于, 系统当前所有活跃的事务, 所以当前行稳定数据对新事务可见, 跳到步骤5.
2.trx_id_current >= trx_id_last, 这种情况也比较好理解, 表示, 该行记录的稳定事务id是在本次新事务创建之后才开启的, 但是却在本次新事务执行第二个select前就commit了,所以该行记录的当前值不可见, 跳到步骤4。
3.trx_id_current <= trx_id_current <= trx_id_last, 表示: 该行记录所在事务在本次新事务创建的时候处于活动状态,从up_limit_id到low_limit_id进行遍历,如果trx_id_current等于他们之中的某个事务id的话,那么不可见, 调到步骤4,否则表示可见。
4.从该行记录的 DB_ROLL_PTR 指针所指向的回滚段中取出最新的undo-log的版本号, 将它赋值该 trx_id_current,然后跳到步骤1重新开始判断。
5.将该可见行的值返回。
(摘自 https://segmentfault.com/a/1190000012650596?utm_source=tag-newest
在这里插入图片描述
由于这样的一种机制,让MySQL在RR的隔离级别下就可以部分的防止了幻读,而为什么是部分防止呢,是因为我们大部分读的sql都属于快照读,即select column from table…而这样的SQL是通过MVCC和undo log的机制产生的一种快照读,被读到的记录实际上并没有加锁,而是根据undo log来读到的历史记录,这样其他事务如果在记录表中insert了一条,虽然在事务里还是读到的是当前的记录,但是我们还是可以修改那条被insert进去的数据,而只有在当前读,即select column from table … for update 这种SQL下(被加了行级锁)才会真正的实现了再RR的隔离级别下就防止了幻读。

别白忙活!EAAI投稿避坑指南:5条红线碰就拒,工程应用重点划重点 EAAI投稿避坑指南:5条红线工程应用要点 投稿《Engineering Applications of Artificial Intelligence》(EAAI)需特别注意5条红线,否则直接拒稿:1)避免提出新隐喻元启发式算法,应聚焦具体工程应用;2)摘要须明确区分AI贡献工程应用;3)标题和摘要禁止使用未定义缩写;4)必须采用单栏格式;5)关键词不能包含缩写。此外,论文需突出AI方法在工程实践中的创新落地价值,建议补充实际工程数据、部署成本分析和传统方法的对比。投稿前务必逐项核查这5条要求,以 阅读详情

相关推荐

InnoDB引擎MVCC实现原理.pptx

InnoDB引擎MVCC实现原理

MVCC 初识

qq_39368007的博客 217

OPTISYSTEM+MATLAB.rar_matlab optisystem_optisystem/Matlab_optisy

optisystemMATLAB之间的联合编程

三分钟图解 MVCC,看一遍就懂

所谓一致性非锁定读就是每行记录可能存在多个历史版本,多版本之间串联起来形成了一条版本链,这样不同时刻启动的事务可以无锁地访问到不同版本的数据。 undo log 版本链 一致性非锁定读是通过MVCC(Multi Version Concurrency Control,多版本并发控制)来实现的。事实上,MVCC 没有一个统一的实现标准,所以各个存储引擎的实现机制不尽相同。 InnoDB 存储引擎中 MVCC 的实现是通过undo log来完成的,undo log 是啥? 简单理解,undo l...

qq_46388795的博客 505

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

一、什么是MVCCmvcc,也就是多版本并发控制,是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。 数据库并发有以下几种场景: 读-读:不存在任何问题。 读-写:有线程安全问题,可能出现脏读、幻读、不可重复读。 写-写:有线程安全问题,可能存在更新丢失等。 mvcc解决的就是读写时的线程安全问题,线程不用去争抢读写锁。 mvcc所提到的读是快照读,也就是普通的select语句。快照读在读写时不用加锁,不过可能会读到历史数据。 还有一种读取数据的方式是当前读,是一种悲观锁的操作。它会对当前读

lans_g的博客 8万+

三分钟图解 MVCC,看一遍就懂,腾讯T2手把手教你

需要注意的是,select 查询操作不会生成 undo log!在 InnoDB 存储引擎中,undo log 只分为两种: insert undo log:在 insert 操作中产生的 undo log update undo log:对 delete 和 update 操作产生的 undo log 事实上,由于事务隔离性的要求,insert 操作的记录,只对事务本身可见,对其他事务不可见,也即插入操作不会对已经存在的记录产生影响!,所以也就不存在并发情况下的问题。所以,也就是说,MVCC

m0_64384350的博客 695

MySQLMVCC详解, 图文并茂简单易懂

ReadView就是事务在使用MVCC机制进行快照读操作时产生的读视图当事务读取数据时, 会数据库系统生成当前的一个快照,InnoDb会为事务构造一个数组, 用于记录并维护系统中当前的活跃事务ID组(活跃是指: 开启了但是还没有进行提交).本文介绍了MVCC在这两种隔离级别下事务在执行快照读操作时访问记录的版本链的过程。这样使不同事务的读-写操作并发执行,从而提升系统性能。核心点在于 ReadView 的原理,在每一次进行普通SELECT操作前都会生成一个ReadView。

m0_70094411的博客 1826

mysqlMVCC多版本并发控制原理的详解

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

nandao158的博客 1万+

MySQLMVCC详解MVCC实现原理(MySQL专栏启动)

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

小明的Java问道之路 6638

深入理解MVCC多版本并发控制的原理应用

MVCC 是一种并发控制机制,旨在通过维护数据的多个版本来实现高效的并发访问。传统的锁机制不同,MVCC 允许读操作和写操作同时进行,从而避免了读写冲突,提高了系统的并发性能。MVCC 是一种通过维护数据的多个版本来实现并发控制的机制。它通过允许读操作和写操作同时进行,提高了系统的并发性能,同时保证了事务的隔离性和一致性。尽管 MVCC 会带来一定的存储和垃圾回收开销,但其在高并发环境下的优势使其成为许多数据库系统的首选并发控制机制。

私聊前往站内信:https://i.csdn.net/#/msg/chat/weixin_44976692 3315

MySQL】一文读懂 MySQL 事务控制 MVCC 多版本并发控制底层原理

📌 MySQL事务深度解析:从并发问题到MVCC机制 本文系统剖析MySQL事务的核心原理应用场景: 1️⃣ 问题引入:以售票系统超卖为例,揭示并发操作导致的数据不一致问题,引出事务的四大特性(ACID)。 2️⃣ 事务基础:详解原子性、隔离性、持久性如何共同保障一致性,对比InnoDBMyISAM的事务支持差异。 3️⃣ 隔离级别实战:通过四种隔离级别(RU/RC/RR/Serializable)的案例演示,解析脏读、不可重复读、幻读的成因解决方案,重点说明MySQL在RR级别通过间隙锁避免幻读的

心向往之,行必能至 2595

MySQL多版本并发控制MVCC

博客主页:🏆看看是李XX还是李歘歘🏆 🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今天的内容是 MySQL多版本并发控制MVCC ⛽️💻💻💻 数据库并发控制——锁 Multiversion (version) concurrency control (MCC or MVCC) 多版本并发控制 ,它是数据库管理系统一种常见的并发控制。 我们知道并发控制常用...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 909

MySQL 8.0 MVCC 源码解析

一文看懂 mvcc 真正的原理

程序员囧辉 1万+

undolog多版本链+ReadView机制实现mvcc多版本并发控制

今天和大家分享一下MVCC的知识,了解MVCC之后,你对mysql的事务隔离理解会更深入。 1.MVCC是什么? MVCC,全称Multi-Version Concurrency Control,即多版本并发控制MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 它主要是用来处理mysql在多线程操作缓存数据时出现的一系列并发问题。 2.前置知识点 (1)什么是脏写、脏读、不可重复读、幻读? 网上相关资料很多,这里不做赘述 (2)四种隔离级

三3三的博客 3176

技术分享 | MySQL 多版本并发控制MVCC

作者:贲绍华爱可生研发中心工程师,负责项目的需求维护工作。其他身份:柯基铲屎官。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

ActionTech的博客 560

MySQLMVCC多版本并发控制(重点:MVCC实现原理之ReadView)

本文重点介绍MySQLMVCC概念、快照读当前读、MVCC实现原理之ReadView、隐藏字段、Undo Log版本链。

爱干饭的猿的博客 866

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

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33970449的博客 265

初识多版本并发控制(MVCC) - 每周学习分享

每周分享的PPT

weixin_34365635的博客 160

一文详解数据库 MVCC

点击上方 "zhisheng"关注,星标或置顶一起成长Flink 从入门到精通系列文章很多开发者都熟悉InnoDB中的MVCC(Multi-Version Concu...

http://www.54tianzhisheng.cn/ 835

【数据库内核】事务MVCC简介

目录 概述 MySQL InnoDB下读操作分类 一、快照读(snapshot read) 二、当前读(current read) 三、当前读,快照读和MVCC的关系 Mysql MVCC实现原理 一、InnoDB引擎的隐式字段 二、undo日志版本链 三、Read View 四、可见性比较算法 结论 概述 MVCC(Multi-Version Concurrency Control 多版本并发控制),是一种不利用锁机制实现的隔离级别,主要实现了在保证数据的一致性的前提下,实.

Night_ZW的博客 910

多版本并发控制MVCC(Multi-Version Concurrency Control )

参考文章:http://www.pgcon.org/2008/schedule/attachments/54_PGCon2008-HOT.ppt http://www.cnblogs.com/gaojian/p/3295951.html 图1:事务T1改变数据V1,将其改为数据V2,在堆中,数据如下图 图2:事务T3改变了V2,将其改为V3,在堆中,数据如下图:目前事

hellochenlu的博客 708
上一篇: 学习总结与分享-数据库的事务与锁入门
下一篇: 学习总结与分享-MySQL的优化(完结篇)
VolcanoWec
博客等级 码龄7年 0粉丝 24原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值