innodb的mvcc

MySQL InnoDB引擎 MVCC 阅读详情

innodb保存了修改过的版本记录,一是为了回滚,二是为了一致性读。

在innodb内部会自动增加三个列。一个6字节的DB_TRX_ID 代表此行数据的最后一次的insert或者update事务。删除也被当作update(有一个单独的bit来标志此行数据已被删除)。一个7字节的DB_ROLL_PTR指针指向回滚段中保存的undo日志地址,如果某行数据被提交修改了,undo日志会保存修改前的记录,以便可以恢复修改之前的数据。最后还有一个6字节的DB_ROW_ID ,当新数据插入的时候自增,如果innodb自动生成了聚簇索引,索引中都会包含这个字段,否则,该列不会出现在索引中。

回滚段中的undo日志分为insert和update两种。insert的undo日志只是为了回滚存在,提交之后就可以丢弃。update的undo日志是为了回滚和一致性读存在,所以只能在没有了可能需要通过该数据的undo日志来建立快照来保持一致性读的事务存在的时候才可以删除(英文版:Update undo logs are used also in consistent reads, but they can be discarded only after there is no transaction present for which InnoDB has assigned a snapshot that in a consistent read could need the information in the update undo log to build an earlier version of a database row),其实就是如果还有一致性读事务可能会需要该数据的早期版本的话,就不能丢弃它的undo日志。所以,周期性(如果可以的话,就尽早)提交事务,即使只是读事务。

回滚段中的撤消日志记录的物理大小通常小于相应的插入或更新行。你可以用它计算你的回滚段(rollback segment)所需空间。

当你执行删除记录的SQL的时候,innodb并不会立即物理移除(从磁盘删除)该数据,只有当它丢弃相应的update undo日志的时候才会物理移除(purge)。这个移除是非常快的。

如果你以近乎相同的速度小批量的删除和插入数据,清除线程(the purge thread)可能会滞后,然后你的表会越来越大。这种情况可以通过优化配置innodb_max_purge_lag系统变量来给清除线程更多的资源执行清除。

mvcc对待聚簇索引和二级索引是不一样的,聚簇索引中的记录会原地更新(updated in place),他们指向undo日志的隐藏系统列可以构建之前的版本;二级索引既没有隐藏系统列也不会原地更新。

当一个或者多个二级索引列被更新时,二级索引会被标记删除,新的记录被插入,最终会清除被删除的索引记录。当二级索引被标记删除或者被其他事务更新的时候,innodb通过聚簇索引查找数据(此时覆盖索引就不能用了),如果有事务在读事务开始之后更改了数据,聚簇索引会根据DB_TRX_ID 和undo日志来重建正确的版本。

看了看官网,自己翻译加理解了一下,后续会改的更简练和准确点。

如有错误,敬请指正,感谢

PostgreSQL的MVCC vs InnoDB的MVCC PostgreSQL的MVCCvs InnoDB的MVCC 任何一个数据库最主要功能之一是可扩展。如果不删除彼此,则尽可能较少锁竞争从而达到这个目的。由于read、write、update、delete是数据库中最主要且频繁进行的操作,所以并发执行这些操作时不被阻塞则显得非常重要。为了达到这种目的,大部分数据库使用多版本并发控制(Multi-Version Concurrency Cont... 阅读详情

相关推荐

STM32 ADC+DMA实战:手把手教你驱动XGZP6847A压力传感器(附完整代码)

本文详细介绍了如何使用STM32的ADC和DMA外设驱动XGZP6847A压力传感器,包括硬件连接、ADC配置、DMA高效传输实现以及数据处理与校准方法。通过实战案例和完整代码,帮助开发者快速掌握高精度压力数据采集技术,适用于工业控制和医疗设备等领域。

weixin_42570484的博客 404

mysql二级索引没有mvcc_MySQL InnoDB MVCC深度分析

关于MySQL的InnoDB的MVCC原理,很多朋友都能说个大概:每行记录都含有两个隐藏列,分别是记录的创建时间与删除时间每次开启事务都会产生一个全局自增ID在RR隔离级别下INSERT -> 记录的创建时间 = 当前事务ID,删除时间 = NULLDELETE -> 记录的创建时间不动,删除时间 = 当前事务IDUPDATE -> 将记录复制一次老记录的创建时间不动,删除时间...

weixin_35731579的博客 898

openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解

文章目录1. 写在前面2. Heatmap 类实现热力图2.1 Heatmap 参数2.2 实现热力图3. 完整代码4. 添加删除map图层的方法5. 热力图自身的get,set方法 1. 写在前面 我们主要看热力图的效果,区域绘制效怎么设置详细内容可以访问 openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解 在 openlayers 中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer、热度图(HeatMap L

@必意玲 1万+

innodb下的mvcc_关于InnoDB中mvcc和覆盖索引查询的困惑?

来天坑了,坑人呀,报错之后表格没了首先我们来了解几个结构view的结构下面解析一下每个字段的含义:low_limit_no:low_limit_id:trx->id >=low_limit_id的事务,当前view不可见up_limit_id:trx->idn_trx_ids:trx_ids:系统中所有活跃事务id列表view_list:view列表聚集索引行结构二级索引记录结构...

weixin_39663593的博客 326

SAP采购订单中项目类别B(限制)的控制逻辑

在笔者所在企业中,框架类采购订单中项目类别需要选择B(限制)。今天笔者从比较全面的角度分析了一下这个项目类别B到底可以决定些什么?控制到什么?先从后台SPRO中打开相应的配置菜单。 打开项目类别B之后,可以看到一些配置信息,这里有一点与其它配置不同的地方,即无法新增项目,也无法修改现有项目。这个疑惑今后再去解决吧。当前只研究项目类别B的控制逻辑。 下面就参考上图中的配置分段来分析和测试其控制逻辑, 1、如项目类别配置图,所需材料值为不允许;经测试,如下图在采购订单创建时,不能输入物料编号条目。

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6032

作物生长模型Oryza V3实战1:为什么要研究它

ORYZAV3是水稻生长模拟模型ORYZA2000的最新升级版本(3.5版),作为作物生长模型,它通过数学方法和计算机技术模拟水稻生长发育过程及其与环境条件的相互作用。主要功能包括:模拟不同条件下的水稻生长和产量形成、评估环境胁迫影响、分析土壤碳氮动态以及进行区域尺度模拟。国内应用广泛,科研机构用于气候变化影响评估、灌溉模式比较等研究,并开展参数敏感性分析和应用培训。使用流程分为六个步骤:确定输入参数(气象、土壤、作物三类)、参数校准、设置模拟环境、运行模型、分析结果(输出50个参数)和计算产量(穗干重×收

504

【mysql】关于innodb中MVCC的一些理解

一、MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能 读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改...

weixin_34376986的博客 454

SQL中的时间计算:员工每日工作时长

摘要:本文介绍了一个使用SQL查询计算员工每日工作时长的实用方法。通过分析包含员工打卡记录的数据库表,利用CTE(公共表表达式)将日期分组,计算最早和最晚打卡时间差,最终以"小时:分钟"格式输出工作时长。该方法适用于每日两次打卡的场景,并提示了处理漏打卡等特殊情况时的注意事项,为企业考勤管理提供了有效的数据支持方案。(148字)

m0_74337424的博客 412

InnoDB下的MVCC

MVCC,是采用乐观锁思想的一种方式; 在 MySQL 中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,但不能解决幻读问题。 如果想要解决幻读问题,就需要采用串行化的方式,也就是将隔离级别提升到最高,但这样一来就会大幅降低数据库的事务并发能力。 我们也可以采用MVCC+Next-Key Lock的方式来解决幻读问题。 MVCC 是什么 MVCC 的英文全称是 Multiversion Concurrency Control,即多版本并发控制技术。 MVCC 是通过数据行的多个版本管

shade7的博客 1782

关于IBV_WR_RDMA_WRITE_WITH_IMM的理解

对于IBV_WC_RECV_RDMA_WITH_IMM的描述是这样的,也就是说并不需要sge,所以下发的sge,可以是NULL,个数可以是0。(1)需要下发post_recv,但是下发是post_recv当中的sge的地址可以是空,sge个数可以是0。伪代码,实际的rkey和addr已经通过socket交换。并且poll_cq时,有返回,在这篇文章当中对于poll_cq时,主要区别点有两个,这个是对于接收端而言。(2)可以带即时数据,

qq_38158479的博客 2418

TC8:IPv4_HEADER_01-04

IPv4_HEADER_01: Ensure that the DUT generates an IPv4 Packet with a Total Length greater than or equal to 20 目的 确保DUT生成的IPv4报文的IP头部中的Total Length字段值大于等于20 IPv4协议头部中的Total Length字段表示整个IP数据包的长度,包括IP Header和payload之和,IP首部的长度最少就有20个字节,所以Total Length值肯定大于等于20

jasonj333 3961

【MYSQL】InnoDB的MVCC详解

readView = {m_ids=[40,60],min_trx_id=40,max_trx_id=61,creator_trx_id=40},这个时候去读数据发现第一条数据trx_id = 60,不等于creator_trx_id,说明并不是自己修改的,并且trx_id 大于min_trx_id,小于max_trx_id,说明此数据在事务A处理的范围内,并且在活跃事务表当中有trx_id = 60,说明此时该事务并未提交,根据RC隔离级别的要求,此时第一条数据不可见。

m0_63011748的博客 1465

微信小程序 - [wxapplib]] backgroundfetch privacy fail {“errno”:101,“errMsg”:“private_getBackgroundFetchDa

微信小程序报错之backgroundfetch privacy fail,微信小程序报错WAServiceMainContext.js:1 [wxapplib]] backgroundfetch privacy fail {“errno“:101,怎么解决?问题出现:调用wx.chooseMessageFile报错(开发者工具中正常)用户隐私协议中未声明小程序使用此功能,安卓真机调试报错:backgroundfetch privacy fail ,怎么解决?微信小程序[wxapplib]] backgrou

🏆 前端领域优质创作者 1万+

InnoDB的MVCC实现原理(InnoDB如何实现MVCC以及MVCC的工作机制)

MVCC(多版本并发控制) 使用锁和锁协议来实现相应的隔离级别来进行并发控制,味道虽好但因为锁会造成事务阻塞,导致并发性能会受到一定的影响。而多版本并发控制使得对同一行记录做读写的事务之间不用相互阻塞等待(写写还是要阻塞等待,因为事务对数据进行更新时会加上排他锁),提高了事务的并发能力,可以认为MVCC是一种解决读写阻塞等待的行级锁。 MVCC的一些重要特性 (1)MVCC只支持RC(读取已提交)...

qq_41008202的博客 7518

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

MySQL InnoDB的MVCC实现机制

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读在学习MVCC多版本并发控制之前,我们必须先了解一下,什么是MySQL InnoDB下的当前读和快照读?

埃泽漫笔 1477

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

innodb如何实现mvcc的

InnoDB 实现 MVCC(多版本并发控制)的机制主要依赖于。)时,InnoDB 为其生成一个。最终事务 A 读取到版本0。

weixin_43728099的博客 956

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

innodb下的mvcc_从InnoDB了解MVCC

原标题:从InnoDB了解MVCCMVCC全称是Multi-Version Concurrency Control,即多版本并发控制。这是种很常用的技术,现在几乎所有的关系数据库都支持它。平时它默默工作,像个透明人,似乎不用关心它的细节。但是当我们偶尔在数据库里面遇到一些奇怪问题时,却不得不需要关注它。因为很可能这些“奇怪”的问题,不过是MVCC里的正常行为;而且,MVCC的设计思路还能在我们日常...

weixin_39633917的博客 300

innodb下的mvcc_关于innodb中MVCC的一些理解

一、MVCC简介MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他...

weixin_34327476的博客 196

innodb下的mvcc_【mysql】关于innodb中MVCC的一些理解

一、MVCC简介MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他...

weixin_39678531的博客 95

InnoDB的MVCC机制

前言 上篇对比了下MySQL常见的InnoDB、MyISAM引擎的对比,说到InnoDB 为了支持高并发,设计了MVCC的机制,再开始之前,先复习下ACID。 ACID 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体。 一致性(Consi...

不积跬步无以至千里 729

MVCC和InnoDB行锁

简单介绍下MVCC的原理 每个事务开启时,都会被分配到一个全局唯一且递增的事务id,即trx_id,当每次事务对某些数据行进行修改时,都会将事务自身的trx_id记录在数据行的隐藏列上。在事务开启的那一刻,MVCC机制会为事务生成一个当前mysql服务器上所有事务的快照。这个快照是按照如下方式实现的: 将当前服务端活跃的全部事务id记录在set中 当前活跃的事务最小id记为min_trx_id 当前活跃的事务最大id记为max_trx_id 当进行一次普通查询的时候,根据数据行上的trx_id进行判断。

程铭程铭你快成名的博客 5811

Innodb MVCC实现原理

MVCC全称多版本并发控制,是在并发访问数据库时对操作数据做多版本管理,避免因为写数据时要加写锁而阻塞读取数据的请求问题。

carolineme的博客 1000

innodb MVCC

undo log 回滚段是记录MVCC历史的一个空间,如果开启了独立表空间,会在独立表空间中创建一个回滚表空间,undo表空间有128个段,其中: 1~32段存放于临时表的系统表空间中 33~127段存放于独立undo表空间中 为了事物并发,每个undo段又分为1024个slot 理论上来说,innodb可支持96*1024个事物并发 RR和RC RR隔离级别(除了Gap锁之外)和RC隔离级别的差...

baijiu1的博客 267

MySQL - InnoDB的MVCC实现机制

MVCC全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库的并发性能,用更好的方式去处理读-写冲突,做到即使有读-写冲突时,也能做到不加锁,非阻塞并发读。当前读。

qq_34949319的博客 916
上一篇: 火车票价还不够高(按照《经济学通识》手敲的(非原创))
下一篇: innodb的缓冲池(buffer pool)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值