Mysql-ReadView + MVCC-RR 与 RC

实验准备

创建脚本
CREATE TABLE `user`  (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`age` int(11) NULL DEFAULT NULL,`addr` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
事务执行脚本
  • 事务1
# 事务1
-- 查询事务隔离级别:
select @@tx_isolation;
-- 设置数据库的隔离级别
set session transaction isolation level read committed;
#没有修改之前的值为杭州
SELECT * FROM tab_user; 
START TRANSACTION
#T1执行
UPDATE user SET addr = '重庆' WHERE id = 1;
#T2执行
UPDATE user SET addr = '成都' WHERE id = 1;
#T7执行
COMMIT;
  • 事务2
# 事务02
-- 查询事务隔离级别:
select @@tx_isolation;
-- 设置数据库的隔离级别
set session transaction isolation level read committed;
START TRANSACTION
#T4执行
UPDATE user SET name = '西安' WHERE id = 1;
#T5执行
UPDATE user SET name = '广东' WHERE id = 1;
#T9执行
COMMIT;
  • 事务3
# 事务3
-- 查询事务隔离级别:
select @@tx_isolation;
-- 设置数据库的隔离级别
set session transaction isolation level read committed;
START TRANSACTION
# T6时刻执行
SELECT * FROM user WHERE id = 1;
# T8时刻执行
SELECT * FROM user WHERE id = 1; 
# T10时刻执行
SELECT * FROM user WHERE id = 1;COMMIT;

执行表记录

时间事务1事务2事务3
T1begin Tbegin Tbegin T
T2更新为重庆
T3更新为成都
T4更新为西安
T5更新为广东
T6执行查询,查询addr属性
T7提交事务
T8执行查询,查询addr属性
T9提交事务
T10执行查询查询addr属性

结果分析

RC

我们假设这三个事务的ID分别是1,2,3
T6时刻的查询版本对应情况如下:
在这里插入图片描述

这个时候执行查询生产ReadView

m_low_limit_idm_idsm_up_limit_idm_creator_trx_id
11233

这时候广东这个版本不符合可见要求因为它在m_ids中所以看下一个版本,发现西安同样不满足要求,接着成都,重庆都不符合要求所以最终取的是杭州这个版本,因为这个是之前的事务做的更改,事务id小于最小的限制。

T8时刻
这个时候执行查询生产ReadView

m_low_limit_idm_idsm_up_limit_idm_creator_trx_id
2233

由于事务1提交了生成的时候1不在m_ids中,所以找到成都已经是可以见的版本,所以最终结果为成都。

T10时刻
这个时候执行查询生产ReadView

m_low_limit_idm_idsm_up_limit_idm_creator_trx_id
333

由于事务1,2都提交了生成的时候1,2不在m_ids中,所以找到广东已经是可以见的版本,所以最终结果为广东。
从上面的结果来看,每次查询都生产RadView保证了事务提交的数据在其它事务中可见,也就是保证了RC隔离性。

RR

如果我们将事务的上面每个事务的隔离性设置为repeatable read

这个时候,只有在在事务三种只有第一次查询T6时刻才会生成ReadView

m_low_limit_idm_idsm_up_limit_idm_creator_trx_id
11233

后面T8,T10都不生产ReadView,那么每次查询可见的版本都是杭州,这样就保证了事务RR隔级别。

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

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

相关文章

Red Panda Dev C++项目的基本操作

最近在Red Panda Dev C上面编写程序时发现,很多小伙伴都会创建项目。今天我带大家看看如何使用一个项目。 一、项目的创建 创建项目 首先,我们需要创建一个项目。 1、打开Red Panda Dev C。 2、点击 “文件[F]” → “新建[N]” → “项目[P]...”&…

精选70套前端数据可视化大屏

分享70款还不错的前端数据可视化大屏源码 其中包含行业:智慧社区、智慧物业、政务系统、智慧交通、智慧工程、智慧医疗、智慧金融银行等,全网最新、最多,最全、最酷、最炫大数据可视化模板。 你可以点击在线预览查看该源码资源的最终展示效果…

从零搭建Vue3 + Typescript + Pinia + Vite + Tailwind CSS + Element Plus开发脚手架

项目代码以上传至码云,项目地址:https://gitee.com/breezefaith/vue-ts-scaffold 文章目录 前言脚手架技术栈简介vue3TypeScriptPiniaTailwind CSSElement Plusvite 详细步骤Node.js安装创建以 typescript 开发的vue3工程集成Pinia安装pinia修改main.ts创…

正点原子--STM32定时器学习笔记(1)(更新中....)

F1系列基本定时器(TIM6 / TIM7) 我们的目标是通过TIM6基本定时器定时500ms,让LED0每隔500ms闪一下! 思路:使用定时器6,实现500ms产生一次定时器更新中断,在中断里执行“翻转LED0”。 定时器什…

docker容器之consul

一、consul解决了什么问题? 如果后端应用服务器集群节点数量很多,前端负载均衡器配置和管理会很麻烦的问题 (负载均衡器的节点配置条目数量会很多,后端节点的网络位置发生了变化还需要修改所有调用这些后端节点的负载均衡器配置等…

Android 12.0 应用中监听系统收到的通知

Android 12.0 通知简介https://blog.csdn.net/Smile_729day/article/details/135502031?spm1001.2014.3001.5502 1. 需求 在系统内置应用中或者在第三方应用中,获取Android系统收到的通知的内容. 2. NotificationListenerService 接口 Android 系统预留了专门的API, 即 No…

Github 2F2【解决】经验帖-PPHub登入

最近在做项目时,Github总是出问题,这是一经验贴 Github 2F2登入问题【无法登入】PPhub 2F2是为了安全,更好的生态 启用 2FA 二十八 (28) 天后,要在使用 GitHub.com 时 2FA 检查 物理安全密钥、Windows Hello 或面容 ID/触控 ID、SMS、GitHub Mobile 都可以作为 2F2 的工…

jenkins 下载插件sentry-cli失败 证书过期

现状 npm set ENTRYCLI_CDNURLhttps://cdn.npm.taobao.org/dist/sentry-cli npm set sentrycli_cdnurlhttps://cdn.npm.taobao.org/dist/sentry-cli 原因是npm原域名停止解析,在访问上面sentry-cli的cdn资源的时候 证书过期无法下载。 解决: 替换证书过期…

【C语言】通讯录实现(下)

目录 1.进阶通讯录特点(下) 2.实现步骤 (1)保存增加的联系人数据到文件中 (2)加载保存的联系人数据 3.完整C语言通讯录代码 (1)contact.h (2)test.c (3)contact.c 4.结语 1.…

MongoDB从入门到实战之MongoDB简介

前言 相信很多同学对MongoDB这个非关系型数据库都应该挺熟悉的,在一些高性能、动态扩缩容、高可用、海量数据存储、数据价值较低、高扩展的业务场景下MongoDB可能是我们的首选,因为MongoDB通常能让我们以更低的成本解决问题(包括学习、开发、…

嵌入式中Qt5.7.1添加支持openssl方法

1、openssl编译 版本:openssl-1.0.2g 一定要选对Qt版本对应的openssl版本,由于开始选的openssl版本不对,导致编译Qt时出现很多错误。 交叉编译 ./config no-asm shared --prefix/opt/Xilinx2018_zynq/zynq_openssl_1.0.2/ --cross-compile…

vivo发布2023 年度科技创新;阿里全新AI代理,可模拟人类操作手机

vivo 发布 2023 年度十大产品技术创新 近日,vivo 发布了「2023 年度科技创新」十大产品技术创新榜单,并将这些技术分为了 4 个板块。 「四大蓝科技」为 vivo 在去年推出的全新技术品牌,涵盖蓝晶芯片技术栈、蓝海续航系统、蓝心大模型、蓝河操…

2023年算法SAO-CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法SAO-CNN-BiLSTM-ATTENTION回归预测(matlab) SAO-CNN-BiLSTM-Attention雪消融优化器优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 雪消融优化器( SAO) 是受自然界中雪的升华和融化行为的启发,开发了一种…

LeetCode 834. 树中距离之和

简单换根DP 其实就是看好变化量&#xff0c;然后让父亲更新儿子就好了&#xff5e; 上图2当根节点的时候&#xff0c;ans[2] ans[0] -sz[2]n-sz[2]; class Solution { public:vector<int> sumOfDistancesInTree(int n, vector<vector<int>>& edges) {v…

Java学习day26:和线程相关的Object类的方法、等待线程和唤醒线程(知识点详解)

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) 往期回顾 Java学习day25&#xff1a;守护线…

假期刷题打卡--Day20

1、MT1173魔数 一个数字&#xff0c;把他乘以二&#xff0c;会得到一个新的数字&#xff0c;如果这个新数字依然由原数中那些数字组成&#xff0c;就称原数为一个魔数。输入正整数N&#xff0c;检查它是否是一个魔数&#xff0c;输出YES或者NO。 格式 输入格式&#xff1a; …

MySQL之SQL的查询语句如何执行

文章目录 前言一、一条查询的SQL是如何执行的二、MySQL的“零件”们1.连接器2.查询缓存3.分析器4.优化器5.执行器 总结 前言 做了多年技术之后&#xff0c;技术更新换代太快&#xff0c;从我入行时候从单体架构到后面分布式SOA&#xff0c;再到微服务&#xff0c;从后端再到全…

Docker搭建MySQL8主从复制

之前文章我们了解了面试官&#xff1a;说一说Binlog是怎么实现的&#xff0c;这里我们用Docker搭建主从复制环境。 docker安装主从MySQL 这里我们使用MySQL8.0.32版本&#xff1a; 主库配置 master.cnf //基础配置 [client] port3306 socket/var/run/mysqld/mysql.sock [m…

Java项目:基于SSM框架实现的教务管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm813基于SSM框架实现的教务管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#x…

Docker进阶篇-DockerFile

一、简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚 本。 构建步骤&#xff1a; 1、编写Dockerfile文件 2、docker build命令构建镜像 3、docker run依镜像运行容器实例 二、Docker构建过程解析 1、Dockerfile…