MySQL的MVCC是什么

文章目录

      • MVCC是什么
      • MVCC的作用
      • MVCC的实现原理
      • Read View是什么
      • Read View如何判断某个版本可以访问

MVCC是什么

MVCC(Multiversion concurrency control)是同一行数据保留多版本的一种方式,进而实现并发控制。
在查询时,通过read view版本链找到对应版本的数据。

MVCC的作用

提升并发性能。对于高并发场景,MVCC比行级锁开销更小

MVCC的实现原理

MVCC的实现依赖于版本链,版本链通过表的三个隐藏字段实现:

  1. DB_TRX_ID:当前事务id(唯一)
  2. DB_ROLL_PRT:回滚指针,指向当前行记录的上一个版本
  3. DB_ROW_ID:主键,如果数据表没有主键,InnoDB会自动生成主键

表的某一行记录示例
在这里插入图片描述

它表示id=1,name=张三,age=19的这条行记录是由事务id=10的事务创建/修改

Read View是什么

read view可以理解为将数据在每个时刻的状态拍成“照片”记录下来。当需要获取时刻t的数据时,就从t时间拍的”照片“上获取数据。
Read View结构:
在这里插入图片描述

Read View如何判断某个版本可以访问

在这里插入图片描述

  1. trx_id == creator_trx_id修改这条行记录的事务如果和创建Read View(也就是查询这条行记录)的事务是同一个事务,那么就可以访问这个版本的行记录数据。
  2. trx_id < min_trx_id:行记录的事务id未提交的最小事务id还要小。说明修改该行记录的事务已经提交。该版本的事务可以被当前事务读取到。
  3. trx_id > max_trx_id:说明当前版本的事务是在生成Read View之后才产生,当前事务无法访问。
  4. min_trx_id <= trx_id <= max_trx_id
    1. 如果在m_ids中存在trx_id,说明是未提交的事务,不可访问
    2. 不存在,说明trx_id已经提交了,可以访问。

例如:
有如下两个事务
在这里插入图片描述
事务id=20的事务将id=1的行记录的name先改成李四,然后改成王五。
事务id=60的事务对其他表进行一些操作。
在这里插入图片描述

此时进行查询select * from users where id = 1,生成的Read View如下图:
在这里插入图片描述 此时未提交的事务有2060,所以m_ids为[20,60]
生成该Read View的是查询语句,所以creator_trx_id=0(一个事务只有对数据库的数据进行修改操作(增,删,改)的时候,才会为事务分配一个唯一事务id,查询操作的事务没有进行对数据进行修改操作,所以trx_id就是默认的0)

将行记录的每个版本的trx_id与时间轴对比,判断此版本是否可以访问
在这里插入图片描述

此时查询能查询到的数据应该是name=“张三”,原因如下表:

nametrx_id == creator_trx_idtrx_id < min_trx_idtrx_id > max_trx_idmin_trx_id <= trx_id <= max_trx_id结果
王五符合,但在m_ids中无法访问
李四同上无法访问
张三符合可以访问

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

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

相关文章

go中make、new和直接var的区别

文章目录直接varmakenew小结直接var func main(){var sli []intfmt.Println(sli) // 打印结果为&#xff1a;[]fmt.Println(len(sli)) // 打印结果为&#xff1a;0fmt.Println(cap(sli)) // 打印结果为&#xff1a;0fmt.Println(sli[0]) // panic: index out of…

[Redis] Redis穿透、雪崩和击穿

穿透 定义&#xff1a; 穿透是指请求的数据在Redis缓存中和数据库中都没有&#xff0c;所以数据库返回了一个空数据&#xff0c;Redis也不会进行缓存&#xff0c;每次请求的数据都会查询数据库。 解决方法&#xff1a; Redis对数据库返回的空数据也进行缓存&#xff0c;并设置…

[Redis] Redis几种部署方式

单机 优点&#xff1a; 部署简单 缺点&#xff1a; 性能受限于单台服务器性能&#xff0c;难以横向拓展&#xff0c;容灾能力差 主从同步 是什么&#xff1a; 主从同步即一个master节点&#xff0c;多个slave节点且slave节点也可拥有slave节点 主从同步的方式有两种&#xff…

论述类文本知识框架_高考语文“论述类文本阅读”:三步走,拿满分

【原创首发】新的学期开始了。高三的定位考试也结束了。成绩下来了&#xff0c;有的同学拿着卷子找着我&#xff1a;“老师&#xff0c;你看看&#xff0c;我第一道大题三道错了两道&#xff0c;咋办呀&#xff1f;”高考语文试卷的第一大道试题”论述类文本阅读“这道题&#…

mysql php ajax_PHP 和 AJAX MySQL 数据库实例

HTML 表单上面的例子包含了一个简单的 HTML 表单&#xff0c;以及指向 JavaScript 的链接&#xff1a;Select a User:Peter GriffinLois GriffinGlenn QuagmireJoseph SwansonUser info will be listed here.例子解释 - HTML 表单正如融金汇银讲到的&#xff0c;它仅仅是一个简…

mysql 5.1升级5.6_mysql 5.1.71升级到5.6.30

mysql 5.1.71升级到5.6.30mysqldump-h主机名 -P端口 -u用户名 -p密码 (–database) 数据库名 >文件名.sql备份MySQL数据库的命令mysqldump-hhostname -uusername -ppassword databasename >backupfile.sql备份MySQL数据库为带删除表的格式&#xff0c;能够让该备份覆盖已…

mysql时间段以后_mysql时间段查询

字段column_time的格式为时间格式from_unixtime将时间戳转换为时间格式 *做个记号&#xff0c;之前纠结了半天select * from wap_content where week(column_time) week(now)如果你要严格要求是某一年的&#xff0c;那可以这样查询一天&#xff1a;select * from table where …

mysql数据自定义随机_Mysql 自定义随机字符串

前几天在开发一个系统&#xff0c;需要用到随机字符串&#xff0c;但是mysql的库函数有没有直接提供&#xff0c;就简单的利用现有的函数东拼西凑出随机字符串来.下面简单的说下实现当时.1.简单粗暴.select ..., substring(MD5(RAND()),floor(RAND()*26)1,6) as rand_str .....…

php连接mysql乱码原因_PHP连接MYSQL出现乱码的原因与解决办法

PHP连接mysql出现乱码的原因与解决方法解决MySql数据库乱码的一个首要前提是保证 数据库数据表前端显示 编码一致&#xff0c;国内项目一般统一设定为GB2312或GBK&#xff0c;而国际化项目则一般使用utf8。另外&#xff0c;字符集设定完毕之后记得重启目标机MySql服务。PHP连接…

MYSQL数据库实验三多表查询_数据库之 MySQL --- 数据处理 之多表查询 (三)

一、多表查询【1】什么是多表查询&#xff1f;即&#xff0c;从多个表中获取数据。注意&#xff1a; 在多表查询是&#xff0c;如果列明在两个表中都有&#xff0c;那么列名前需要加上表名sql优化&#xff1a;列名前最好加上表名&#xff0c;尤其在多表查询时SELECT employees.…

php mysql redis mq_docker 搭建 php-mysql-nginx-redis-rabbitmq环境

#创建redisdocker create -p 6379:6379 -v redis:/data --restartalways --name myredis redis#创建mysqldocker create --name mysql -p 3306:3306 -v mysql:/var/lib/mysql --restartalways -e MYSQL_ROOT_PASSWORDAbc123456 mysql:5.6 --character-set-serverutf8 --collati…

session mysql java_PHP自定义session处理方法,保存到MySQL数据库中

我们都知道&#xff0c;session是为了解决因特网的无状态属性而创造出来的。我们可以用session这种会话管理机制来构建购物车、监控站点网络访问&#xff0c;甚至还可以跟踪某一个用户具体是如何使用你的应用的。PHP默认的session处理行为已经能应付大部分的场景&#xff0c;但…

linux查看非注释行_Linux筛除空行和注释行的技巧

CentOS7.3学习笔记总结(四十一)- Linux筛除空行和注释行的技巧 在linux系统中的很多文件,写程序的人为了方便查阅整篇文档,写了很多注释,加了很多空行,虽然方便了整体的阅读,但是参数的添加、删除、修改等就没有那么友好了,我们就需要利用命令行筛选出没有这些内容的内容…

mysql数据迁移双写_数据迁移类测试策略

二、迁移类测试策略1、概述随着业务需求或数据量增长到一定程度&#xff0c;往往需要进行数据库切换&#xff0c;这里就伴随这数据迁移。关键字&#xff1a; 全量数据迁移&#xff0c;增量数据迁移&#xff0c;分库分表&#xff0c;数据双写&#xff0c;oracle、mysql、hbase……

python创建追加_Python文件的创建与追加

(转载)https://www.xshell.net/python/python_open.htmlPosted by 破冰 on 2013-9-17 17:29 Tuesday一、用Python创建一个新文件&#xff0c;内容是从0到9的整数, 每个数字占一行&#xff1a;#python>>>fopen(f.txt,w) # r只读&#xff0c;w可写&#xff0c;a追加&…

medoo update mysql_Medoo Update的使用:修改更新数据

update方法&#xff1a;update($table, $data,$where)&#xff0c;接受三个参数的传入&#xff0c;第三个可默认不传第一个需要传入的参数类型为字符串&#xff1a;String&#xff0c;即为要修改更新数据的数据表名第二个需要传入的参数类型为数组&#xff1a;array()&#xff…

vue限制只能输入数字_vue的input中,如何限制只能输入number

本来想用watch观察v-model的值&#xff0c;一旦不是数字&#xff0c;就让新值等于旧值&#xff0c;后来发现不行。h5的type”number”属性在手机上无效。有什么比较好的方法吗<input v-model"num">type”tel”的作用是直接弹出数字键盘吧&#xff0c;这样好像也…

where is null mysql_SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法

SET SQL SELECT * FROM Comment with(nolock) WHERE 11And (ProjectIds Is Null or ProjectId ProjectIds)And (Scores is null or Score Scores)印象中记得&#xff0c;以前在做Oracle开发时&#xff0c;这种写法是会导致全表扫描的&#xff0c;用不上索引&#xff0c;不知道…

lambda的java_一分钟搞明白java8中的lambda

项目结构是这样的User是一个普通的pojo类UserCompare是一个实现了Comprator的类现在我们有一个需求&#xff1a;给一个user组成的list 按照user的年龄排序。实现不难&#xff0c;代码如下&#xff1a;这种方法由于sort方法的第二个参数是Comparator 所以你要写一个实现类(我这里…

hash的算法 java_Java常用HASH算法总结【经典实例】

本文实例讲述了Java常用HASH算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/*** Hash算法大全* 推荐使用FNV1算法* algorithm None* author Goodzzp 2006-11-20* lastEdit Goodzzp 2006-11-20* editDetail Create*/public class HashAlgorithms{/**//*** 加法has…