mvcc原理_Mysql MVCC实现原理

本文中用到的概念解释

数据读取特性

不可重复读

指一个事务范围内两个相同的查询却返回了不同数据

这是由于查询时系统中其他事务修改的提交而引起的

幻读

在两个连续的查找之间一个并发的修改事务修改了查询的数据集,导致这两个查询返回了不同的结果

这是由于查询时系统中其他事务新增或者删除记录引起的

事务隔离级别

Read Commited(提交读)

一个事务从开始到提交前,所作的任何修改对其他事务不可见

仅能读取到已提交的记录,这种隔离级别下,每条语句都会读取已提交事务的更新,若两次查询之间有其他事务提交,则会导致两次查询结果不一致。

Repeatable Read(可重复读)

在同一个事务中,多次读取同样的记录的结果是一致的

快照读与当前读

在MVCC并发控制中,读操作可以分成两类,快照读与当前读

快照读

读取的是记录数据的可见版本(可能是过期的数据),不用加锁

简单select使用该读取方式

当前读

读取的是记录数据的最新版本,并且当前读返回的记录都会加上锁,保证其他事务不会再并发的修改这条记录

select ... lock in share mode

select ... for update

insert

update

delete

以上查询将使用当前读

什么是MVCC

指多版本并发控制,让普通的select语句直接读取指定版本的值,避免加锁,来提高并发请求时的性能,配合行锁机制,在并发请求下,提高了MYSQL的性能

MVCC解决了什么问题

做到了读不影响写,写不影响读,提高了并发性能

提供了一致性读的功能,避免幻读和不可重复读

什么时候会用到MVCC

在RC和RR隔离级别下,innodb通过快照读方式读取数据时使用

MVCC实现原理

通过保存数据在某个时间点的快照来实现,具有以下两个特点

不管执行多长时间,同一个事务在执行的过程中看到的数据是一致的

根据事务的开始时间不同,不同事务的对同一张表,同一时刻看到的数据可能是不一样的

MVCC具体实现

隐藏列

innodb行都设置了隐藏列(对查询不可见),和MVCC有关的包含如下

f899c6e256f4ce483d198dd23a094d18.png

DATA_TRX_ID: 产生这条记录的事务ID,INSERT/UPDATE/DELETE时都会更新这个记录

DATA_ROLL_PTR: 指向该行回滚段的指针,该行上所有旧的版本,在undo中都通过链表的形式组织,该值指向undo中下一个历史记录,历史记录按照由新到旧顺序排列

DELETED: BIT位,删除标志0或者1

事务链表(当前活跃链表)

a299d9e9b2d6cea0a246db1732eec620.png

MySQL中的事务在开始到提交这段过程中,都会被保存到一个叫trx_sys的全局事务链表中,这是一个基本的链表结构

事务链表中保存的都是还未提交的事务,事务一旦被提交,则会被从事务链表中摘除

ReadView

52d1de832b96e4661422c3aac6c9ed2c.png

在SQL开始的时候被创建的一个数据结构,包含以下三个

low_limit_id 表示该SQL启动时,当前事务链表中最大的事务id编号,也就是最近创建的除自身以外最大事务编号;

up_limit_id 表示该SQL启动时,当前事务链表中最小的事务id编号,也就是当前系统中创建最早但还未提交的事务;

trx_ids 存储当前trx_sys事务链表中的事务id集合。

数据读取规则

逻辑图

a92e0e0e7be284cc374c28628bdbbfd4.png

流程描述

先根据DATA_TRX_ID,ReadView 判断记录可见性

如果可见,根据 DELETED 判断数据是否删除

如果不可见,根据 DATA_ROLL_PTR 判断是否有历史版本,没有则结束,如果有则取出历史版本,重新执行这个流程,直到找到可见数据或者检查完所有历史版本

如何判断可见性

DATA_TRX_ID小于up_limit_id

说明在事务开始前已经提交完成的数据,对于当前事务来说是可见的

DATA_TRX_ID大于low_limit_id

说明在查询的时候,这条数据还没有提交,不可见

DATA_TRX_ID位于up_limit_id和low_limit_id之间

遍历ReadView中的trx_ids,判断DATA_TRX_ID是否在其中

如果不在,表示事务已提交,数据可见

如果在,表示事务未提交,数据不可见

MVCC是如何解决幻读和不可重复读问题的

关键在于创建ReadView的时机

在RC隔离级别下,单个事务每次执行SELECT语句时都会创建ReadView,所以两个相同条件的查询可能由于随着时间的推移,ReadView更新后可以看到更多已提交的数据,导致不可重复读和幻读

在RR隔离级别下,单个事务只会在第一次执行SELECT查询时创建ReadView,后续不再更新,所以整个事务期间可以看到的数据都是相同的,不会出现不可重复读和幻读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java数组复制的方式和效率比较

java中,数组的复制有以下三种方式: 1. 调用System.arraycopy(Arrays.copyOfRange可以当作第四种,但是底层调用的是System.arraycopy,所以,认为是同一种,下面是Arrays.copyOfRange的方法实现&…

Java命令行界面(第18部分):JCLAP

Giles Winstanley的JCLAP ( Java命令行参数解析器 )是基于Java的命令行处理库的系列文章中介绍的第18个库。 这篇文章的示例基于需要Java 8的 JCLAP 1.4 。 JCLAP主页上指出:“ JCLAP帮助Java开发人员为其应用程序创建易于使用的命令行界面。…

数据拆分_数据拆分,偏方请拿好

小伙伴们好啊,今天老祝和大家分享一个比较特殊的数据拆分实例。先来看一组数据:这是一些从系统中导出的数据,一个序号后面连接一个姓名,但是现在都挤在了一个单元格里。咱们要把这些数据变成下面的效果:接下来&#xf…

sql文字转换全拼_取汉字全拼的SQL函数

/*根据汉字获取全拼1.生成所有读音临时表2.根据Chinese_PRC_CS_AS_KS_WS 排序获取读音*/CREATE function f_GetPinYin(str varchar(100))returns varchar(8000)asbegindeclare re varchar(8000)--生成临时表declare t table(chr nchar(1) collate Chinese_PRC_CS_AS_KS_WS,py n…

jaxb入门_JAXB教程–入门

jaxb入门注意:请查看我们的Java XML绑定JAXB教程– ULTIMATE指南 什么是JAXB? JAXB代表用于XML绑定的Java体系结构。它用于将XML转换为java对象,并将java对象转换为XML。JAXB定义了一个用于在XML文档中读写Java对象的API。与SAX和DOM不同&am…

P2863 [USACO06JAN]牛的舞会The Cow Prom

题目描述 The N (2 < N < 10,000) cows are so excited: its prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform the Round Dance. Only cows can perform the Round D…

call需要多大带宽 video_LTE杂谈之IMS voice 和video call流程

pan >SIP Message Logged Bytes 1951Message ID IMS_SIP_INVITEResponse Code INFORMAL_RESPONSE (0)CM Call ID 2SIP Call ID 842064754_23544448882409:8804:8000:186e:9fb:f711:a6d6:ead会话标识&#xff0c;整个流程不变Sip Message INVITEtel:10086;phone-context…

取消堆集以提高延迟并减少AWS账单

大多数性能问题可以通过几种不同的方式解决。 多数人都容易理解和应用许多适用的解决方案。 一些解决方案&#xff0c;例如从JVM管理的堆中删除某些数据结构&#xff0c;则更为复杂。 因此&#xff0c;如果您不熟悉此概念&#xff0c;我建议您继续学习我们最近如何减少应用程序…

python 环境常用指令(updating...)

# 配置pip 源 mkdir -p ~/.pip && cat >> pip.conf <<EOF [global] timeout 60 index-url https://pypi.doubanio.com/simple EOF # pyenv 安装 所需依赖&#xff1a; yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel…

shell 删除了hdfs 文件,在HDFS上删除超过10天的文件

Is there a way to delete files older than 10 days on HDFS?In Linux I would use:find /path/to/directory/ -type f -mtime 10 -name *.txt -execdir rm -- {} \;Is there a way to do this on HDFS? (Deletion to be done based on file creation date)解决方案Solution…

mysql使用方法_Mysql的常用用法

一、mysql中limit的用法详解[数据分页常用]在我们使用查询语句的时候&#xff0c;经常要返回前几条或者中间某几行数据&#xff0c;这个时候怎么办呢&#xff1f;不用担心&#xff0c;mysql已经为我们提供了这样一个功能。SELECT * FROM table LIMIT [offset,] rows | rows OF…

MTK 移植泰文输入法

1.移植zi输入法 1.1 在文件..\make\XXX_GPRS.mak中 讲输入方式改为MMI_ZI XXX_LANGUAGE EN_SM_THAI INPUT_METHOD MMI_XI 1.2在MMI_feature.h 打开相应的ZI语言输入法的宏开关&#xff0c; #if defined(CFG_MMI_LANG_THAI) && ((CFG_MMI_LANG_THAI __ON__)||(CFG_MM…

java中无法推断类型参数_Java中的推断异常

java中无法推断类型参数借用和窃取其他语言的概念和想法总是很高兴的。 Scala的Option是我真正喜欢的一个主意&#xff0c;因此我用Java编写了一个实现。 它包装了一个可能为null或不为null的对象&#xff0c;并提供了一些可用于某种分类功能的方法。 例如&#xff0c;isDefine…

H3C 三种生成树协议特性的比较

转载于:https://www.cnblogs.com/fanweisheng/p/11153361.html

使用HazelCast进行休眠缓存:基本配置

以前&#xff0c;我们对JPA缓存&#xff0c;机制以及hibernate提供的内容进行了介绍 。 接下来是一个使用Hazelcast作为二级缓存的休眠项目。 为此&#xff0c;我们将在JPA中使用一个基本的spring boot项目。 Spring Boot使用休眠作为默认的JPA提供程序。 我们的设置将非常接…

mysql事务实战_mysql事务隔离级别详解和实战

A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据但是 在A事务中查询的话 查到的都是操作之后的数据没有提交的数据只有自己看得到&#xff0c;并没有update到数据库。查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别&#xff1a;mysql> sele…

微云 linux_编年史与微云

微云 linux总览 我面临的一个常见问题是&#xff1a; 如果是单个作者&#xff0c;多个读者&#xff0c;如何缩放基于Chronicle的系统。 尽管有解决此问题的方法&#xff0c;但很有可能根本不会有问题。 微云 这是我用来描述单个线程来完成当前由多个服务器完成的工作的术语。 …

H3C 计算子网内可用主机地址数

转载于:https://www.cnblogs.com/fanweisheng/p/11153665.html

mysql中两次排序_MySQL中的两种排序方式: index和filesort

index &#xff1a;通过有序索引顺序扫描直接返回有序数据&#xff0c;不需要额外的排序&#xff0c;操作效率较高。filesort&#xff1a;通过对返回数据进行排序&#xff0c;filesort 并不代表通过磁盘文件排序&#xff0c;而是说明进行了一个排序操作&#xff0c;至于排序操作…

Java命令行界面(第2部分):args4j

在上一篇文章中 &#xff0c;我研究了如何使用Apache Commons CLI在Java应用程序中解析命令行参数。 在本文中&#xff0c;我将使用另一个库args4j进行相同的操作。 args4j采用了一种不同于Commons CLI的方式来指定Java应用程序应期望的命令行参数。 尽管Commons CLI期望代表选…