MySQL高级-MVCC-基本概念(当前读、快照读)

文章目录

  • 1、MVCC基本概念
    • 1.1、当前读
      • 1.1.1、创建表 stu
      • 1.1.2、测试
    • 1.2、快照读

1、MVCC基本概念

全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段undo log日志readView

1.1、当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select…lock in share mode(共享锁),select…for update、update、insert、delete(排他锁)都是一种当前读。

1.1.1、创建表 stu

mysql> DROP TABLE IF EXISTS `stu`;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> CREATE TABLE `stu`  (->   `id` int NOT NULL AUTO_INCREMENT,->   `age` int NOT NULL,->   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, ->   PRIMARY KEY (`id`) USING BTREE,->   INDEX `idx_t_age`(`age`) USING BTREE-> ) ENGINE = InnoDB CHARACTER SET = utf8mb4;
Query OK, 0 rows affected (0.37 sec)mysql> INSERT INTO `stu` VALUES (1, 1, 'tom');
Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO `stu` VALUES (3, 3, 'cat');
Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO `stu` VALUES (8, 8, 'rose');
Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO `stu` VALUES (11, 11, 'jetty');
Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO `stu` VALUES (19, 19, 'lily');
Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO `stu` VALUES (25, 25, 'luci');
Query OK, 1 row affected (0.00 sec)mysql> 
mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)mysql> 

1.1.2、测试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

select * from stu lock in share mode;
  • 在测试中我们可以看到,即使是在默认的RR隔离级别下,事务A中依然可以读取到事务B最新提交的内容,
  • 因为在查询语句后面加上了 lock in share mode 共享锁,此时是当前读操作。
  • 当然,当我们加排他锁的时候,也是当前读操作。

1.2、快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读

  • Read Committed:每次select,生成一个快照读
  • Repeatable Read:开启事务后第一个select语句才是快照读的地方
  • Serializable:快照读会退化为当前读

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

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

相关文章

OpenCV cv::Mat到 Eigen 的正确转换——cv2eigen

在进行计算机视觉项目时,我们经常需要处理相机位姿的变换。最近,我在项目中遇到了一个看似简单但实际上颇具挑战性的问题:从 OpenCV 的 cv::Mat 格式转换到 Eigen 库的格式。这个过程中遇到了一些问题,但最终找到了一个稳健的解决…

镂空的文字?分享 1 段优质 CSS 代码片段!

大家好,我是大澈! 本文约 800 字,整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段优质 CSS 代码片段,实现 CSS 文字镂空的效果。 老规矩,先阅读代码片段并思考,再看代码解析再思考&#…

nginx本地域名配置

修改hosts文件(仅限本地测试): 在Windows上,hosts文件位于C:\Windows\System32\drivers\etc\hosts。 打开hosts文件,添加一行:127.0.0.1 xxx.com (xxx.com为自己设定的域名) 如果修…

Leetcode3190. 使所有元素都可以被 3 整除的最少操作数

Every day a Leetcode 题目来源:3190. 使所有元素都可以被 3 整除的最少操作数 解法1:遍历 遍历数组,累加最少操作数,即 min(num % 3, 3 - num % 3)。 代码: /** lc appleetcode.cn id3190 langcpp** [3190] 使所…

uniapp+vue3开发微信小程序踩坑集

本文主要记录使用uniappvue3开发微信小程序遇见的各种常见问题及注意点。(持续更新) 问题: 自定义组件为什么有些样式加不上去 给自定义组件增加class的时候,有时候不生效有时候生效,一度让我怀疑自己记忆错乱。后来…

C++枚举

C枚举 枚举的基础用法不不再赘述枚举的三点问题1、作用域问题解决思路1解决思路2 2、隐式转换成int3、枚举变量的实际类型无法明确指定 枚举的基础用法不不再赘述 枚举的三点问题 1、作用域问题 举个例子,颜色有blue代表蓝色,心情有blue代表忧郁。 以…

mysql安装配置教程

mysql安装配置教程 MySQL是一个流行的关系型数据库管理系统,用于存储和管理数据。下面是简要的MySQL安装配置教程: 步骤1:下载MySQL 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/)下载适合您操作系统…

Java冒泡排序实现及应用解析

Java冒泡排序实现及应用解析 冒泡排序是计算机科学中最基本的排序算法之一,尽管它的效率不是最高的,但由于其实现简单,它在教学和某些特定场景下仍然具有不可替代的作用。本文将从Java语言的角度,深入探讨冒泡排序的基本原理、实…

全国31省细分产品出口数据集(2002-2022年)

数据简介:整理全国31个省直辖市自治区按hs码分的22类细分产品的出口数据,只包含22类的细分,不包含更细的类目。可用来计算出口产品质量,出口产品技术复杂度等指标,数据区间为2002-2022年。 数据名称:31省细…

《昇思25天学习打卡营第11天 | 昇思MindSpore基于 MindSpore 实现 BERT 对话情绪识别》

11天本节学习到BERT全称是来自变换器的双向编码器表征量,它是Google于2018年末开发并发布的一种新型语言模型。BERT模型的主要创新点都在pre-train方法上,即用了Masked Language Model和Next Sentence Prediction两种方法分别捕捉词语和句子级别的repres…

【SGX系列教程】(五)Intel-SGX 官方示例分析(SampleCode)——RemoteAttestation

文章目录 一.RemoteAttestation原理介绍1.1 远程认证原理1.2 远程认证步骤1.3 远程认证基本流程1.4 IAS通过以下步骤验证报告的签名1.5 关键术语1.6 总结二.源码分析2.1 README2.1.1 README给出的编译流程2.2 重点代码分析2.2.0 主要代码模块交互流程分析2.2.1 isv_app文件夹2.…

python-18-零基础自学python-用类创建冰淇凌小店的口味

学习内容:《python编程:从入门到实践》第二版 知识点: 类、子类、继承、调用函数 练习内容: 练习9-6:冰激凌小店 冰激凌小店是一种特殊的餐馆。编写一个名为IceCreamStand的类,让它继承为完成练习9-1或…

YonBIP 获取项目代码配置(图文)

项目开发文件在本地环境重新部署后,开发端机器需要重新部署,在此记录一下操作过程。 1. 新建项目目录,在目录下点鼠标右键,选 Git Bash Here 2. 开始下载代码,根据代码量多少,几分钟就能下载完成。 3. 下载…

任意密码重置漏洞

文章目录 1. 任意密码重置漏洞原理2. 任意密码重置漏洞产生原因3. 任意密码重置漏洞场景3.1 验证码爆破3.2 验证凭证回传3.3 验证凭证未绑是用户3.4 跳过验证步骤3.5 凭证可预测3.6 同时向多个账户发送凭证 4. 任意密码重置经典案例4.1 中国人寿某重要系统任意账户密码重置4.2 …

【单元测试】Controller、Service、Repository 层的单元测试

Controller、Service、Repository 层的单元测试 1.Controller 层的单元测试1.1 创建一个用于测试的控制器1.2 编写测试 2.Service 层的单元测试2.1 创建一个实体类2.2 创建服务类2.3 编写测试 3.Repository 1.Controller 层的单元测试 下面通过实例演示如何在控制器中使用 Moc…

什么是死锁以及如何避免

什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进…

关于配置webpack eslint插件版本问题说明

webpack相关版本说明 按照当前情况下,以及eslint-webpack-plugin的官方版本使用的是8.x版本的eslint,我们进行如下依赖安装 npm i -D eslint8 eslint-webpack-plugin "devDependencies": {"eslint": "^8.57.0","eslint-webpac…

简单了解下Java中锁的概念和原理

你好,这里是codetrend专栏“高并发编程基础”。 Java提供了很多种锁的接口和实现,通过对各种锁的使用发现理解锁的概念是很重要的。 Java的锁通过java代码实现,go语言的锁通过go实现,python语言的锁通过python实现。它们都实现的…

Apache Calcite Linq4j学习

Lin4j简介 Linq4j是Apache Calcite项目中的一个模块,它提供了类似于LINQ(Language-Integrated Query)的功能,用于在Java中进行数据查询和操作。Linq4j可以将逻辑查询转换为物理查询,支持对集合进行筛选、映射、分组等…

python自动例化verilog

python自动例化verilog 使用方法&#xff1a;在gvim页面&#xff0c;使用命令自动例化 :r !AUTO_inst xxx.v #python import re import sysmdl_re r"\s*module\s*(?P<mname>\w) *" port_re r"\s*(?P<dir>input|output)\s(?P<typ>wire|re…