MySQL数据库————MVCC

news2025/7/12 14:40:14

MySQL的脏读、幻读、不可重复读

脏读

在这里插入图片描述

现在有两个事务在操作table表,事务B修改了id=2的name字段为李老四,但是没有提交,事务A查询id=2的数据,得到name为李老四;事务B发生回滚,id=2的数据的name又变回李四,这时候事务A得到的name的值还是李老四,也就是说事务A读取到了别的事务未提交的数据,这就是脏读。

幻读

在这里插入图片描述
事务A,查询table表,获取到一条id=2,name='李四’的数据,紧接着,事务Adelete掉了table的数据,这时候table应该为空;在A处理其他任务时,事务B向table表中添加了一条id=3,name='王五’的数据,等事务A再次查询table表时,发现多出来一条数据,一次事务前后数据量发生变化,这就是幻读。

不可重复读

在这里插入图片描述
事务A查询table表中id=2的数据,得到name的值为李四,接着事务A处理其他任务,期间事务B修改了id=2的数据的name为李老四,并且提交。等事务A再一次查询table中id=2的数据,发现name的值变了为李老四。一个事务前后两次查询同一条数据,值不相同,这就是不可重复读。

小结

脏读:指读取到了其他事务正在处理还未提交的数据
幻读:指在并发情况下,新增、删除这种会产生数据量变化的操作时,另一个事务前后查询相同数据时不符合预期
不可重复读:指并发更新时,另一个事务前后查询相同数据时,数据不符合预期

事务隔离级别

隔离级别脏读不可重复读幻读加锁读
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ是(InnoDB除外)
SERIALIZABLE

如何修改隔离级别

# 获取当前事务隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';
# 设置当前会话事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 级别;

MVCC

在MySQL InnoDB存储引擎下READ COMMITTED、REPEATABLE READ(多版本并发控制)进行并发事务控制,MVCC是基于“数据版本”对并发事务进行访问。
在这里插入图片描述

  • RR隔离级别
    • 结果:select 1,name=‘王五’;select 2,name=‘王五’
    • 过程:select1在查询时事务A已经提交,事务B未提交,所以name为王五,select2查询时,即便事务B已提交,由于隔离级别为可重复读,所以name还是王五
  • RC隔离级别
    • 结果:select1,name=‘王五’;select2,name=‘王老五’
    • 过程: select1在查询时事务A已经提交,事务B未提交,所以name为王五,select2查询时,事务B已提交,隔离级别又是读已提交,所以结果为name=‘王老五’

基于UNDO_LOG版本链

在这里插入图片描述

每一条数据链都会保存修改这条数据时的事务的id(自增),以及上一版本的数据链的地址和本次修改后的表数据的值。

ReadView

ReadView是“快照读”,SQL执行时MVCC提取数据的依据。快照读就是普通的select查询,当前读指在执行insert、update、delete、select…for…update、select…lock in share mode等语句时进行数据读取的方式。

ReadView结构

Read View是一个数据结构:

字段名含义
trx_list当前活跃的事务id集合
up_limit_id最小活跃事务id
low_limit_id预分配事务id,当前最大事务id+1

版本链数据访问规则:

  1. 判断DB_TRX_ID < up_limit_id,如果成立,则当前事务可以看到DB_TRX_ID所在的记录,反之则进行下一个判断
  2. 判断DB_TRX_ID >= low_limit_id,如果成立,则代表DB_TRX_ID所在的记录在ReadView生成后才出现的,那么对于当前事务肯定是不允许访问,如果不成立,进入下一步判断
  3. 判断DB_TRX_ID是否存在与活跃事务集合trx_list中,如果在,说明ReadView生成时,这个事务还是活跃的,还没有commit提交修改的数据,当前事务不允许访问,如果不在,则说明ReadView生成时,已经提交了修改结果,可以访问。

读已提交(RC)

在每一次执行快照读时生成新的ReadView。
分析事务D两次查询时的ReadView

  • select1

trx_list={2,3,4},
up_limit_id=2,
low_limit_id=5

  • select2

trx_list={3,4},
up_limit_id=3,
low_limit_id=5

在select1时,当前事务DB_TRX_ID=3,up_limit_id=2,DB_TRX_ID < up_limit_id不成立,进行下一步判断;low_limit_id=5,DB_TRX_ID >= low_limit_id不成立,所以进行第三步判断;DB_TRX_ID存在于trx_list中,是活跃的,不允许访问,接着同样的方法分析DB_TRX_ID=2。当DB_TRX_ID=1时,DB_TRX_ID < up_limit_id成立,所以可以访问。所以查到的数据是name=‘王五’。
在select2时,当前事务DB_TRX_ID=3,up_limit_id=2,DB_TRX_ID < up_limit_id不成立,进行下一步判断;low_limit_id=5,DB_TRX_ID >= low_limit_id不成立,所以进行第三步判断;DB_TRX_ID存在于trx_list中,是活跃的,不允许访问,接着同样的方法分析DB_TRX_ID=2。DB_TRX_ID=2时,前两步判断不成立,第三步时,DB_TRX_ID=2不存在于trx_list中,说明DB_TRX_ID=2的数据已经是commit的,所以可以访问,所以结果是name=‘王老五’。

可重复读(RR)

和上述RC过程一样,不同点在于,RR隔离级别,在一次事务中只在第一次快照读的时候生成ReadView,后面的快照读都会服用第一次生成的ReadView,所以,select1和select2的结果都是name=‘王五’。(特例:如果在两次快照读之间,存在了当前读,那么ReadView会重新生成,导致产生幻读)

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

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

相关文章

Linux 防火墙配置(iptables和firewalld)

目录 防火墙基本概念 Iptables讲解 Iptables表 Iptables规则链 Iptables控制类型 Iptables命令配置 firewalld讲解 Firewalld区域概念 Firewalld两种配置方法 firewall-cmd命令行基础配置 firewall-config图形化配置 防火墙基本概念 防火墙就是根据系统管理员设定的…

用 tensorflow.js 做了一个动漫分类的功能(二)

前言&#xff1a;前面已经通过采集拿到了图片&#xff0c;并且也手动对图片做了标注。接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型&#xff0c;最后就可以实现在采集中对图片进行自动分类了。这种功能在应用场景里就比较多了&#xff0c;比如图标素材站点&#xff0…

java集成redis简单存储

这里主要将数据存redis并设置过期时间、通过key删除redis、通过key更新redis&#xff08;续期&#xff09; 将数据存redis并设置过期时间 引入redis依赖 import org.springframework.data.redis.core.StringRedisTemplate;AutowiredStringRedisTemplate stringRedisTemplate…

【基础教程】Appium自动化测试,太详细了!

Appium简介Appium是一款开源的Appium自动化工具, 基于Webdriver协议, 主要有以下3个特点:全能: 支持iOS/Andorid/H5/混合App/WinApp通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各种语言开源: 免费App自动化测试工具对比iOS官方:Uiautomation/XCUITest: 白盒, UI测…

(二十)、完成个人中心页面的数据统计+设置详情页点赞用户的头像组【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;个人中心页面的数据统计 数据统计包括两项内容&#xff1a;1.当前登录用户的点赞总数量。2.当前登录用户发布文章的总数量 1.1&#xff0c;在self页面data中定义对象 data() {return {totalObj:{artNum:0,likeNum:0}};},1.2&#xff0c;获取总数量的方法&#x…

多线程(初识线程)

线程的诞生 了解进程存在的意义 实现了并发编程的效果&#xff08;并发编程&#xff1a;有可能是并发执行&#xff0c;也有可能是并行执行&#xff09; 并发编程的目的&#xff1a;充分利用上多核CPU资源&#xff0c;提升运行效率 了解进程创建和销毁的过程带来的问题 进程是…

系列二、函数

一、定义 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码MySQL中 已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。二、字符串函数 2.1、案例 2.1.1、concat 字符串拼接 s…

js中?.、??的具体用法

1、?. &#xff08;可选链运算符&#xff09; 在javascript中如果一个值为null、undefined&#xff0c;直接访问下面的属性&#xff0c;会报 Uncaught TypeError: Cannot read properties of undefined 异常错误。而在真实的项目中是会出现这种情况&#xff0c;有这个值就读这…

泛型擦除(Generic erase)(内含教学视频+源代码)

泛型擦除&#xff08;Generic erase&#xff09;&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87473560 源代码中使用的泛型&#xff0c;在经过编辑后&#xff0c;代码中就看不到泛…

PX4之飞行控制框架

PX4的飞行控制程序通过模块来实现&#xff0c;与飞控相关的模块主要有commander&#xff0c;navigator&#xff0c;pos_control&#xff0c;att_control这几个&#xff0c;分别可以在src/modules目录中找到。 commander - 指令/事件处理模块&#xff0c;处理指令、遥控器输入和…

新C++(9):谈谈,翻转那些事儿

"相信羁绊&#xff0c;相信微光&#xff0c;相信一切无常。"一、AVL树翻转那些事儿(1)什么是AVL树&#xff1f;在计算机科学中&#xff0c;AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1&#xff0c;所以它也被称为高度平衡树。…

网上插画教学哪家质量好,汇总5大插画培训班

网上插画教学哪家质量好&#xff1f;给大家梳理了国内5家专业的插画师培训班&#xff0c;最新五大插画班排行榜&#xff0c;各有优势和特色&#xff01; 一&#xff1a;国内知名插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画、古风插…

Tencent OS下逻辑卷(LVM)创建和扩容

测试环境是一个虚拟机&#xff0c;原配置1个虚拟盘。 创建4个虚拟盘&#xff0c;每盘2G并挂载在虚拟主机上&#xff0c;启动虚拟主机开始测试。 LVM英文是Logical Volume Manager&#xff0c;直接翻译为逻辑卷管理。 这种磁盘管理模式比较灵活&#xff0c;在磁盘空间不足的时…

深入浅出C++ ——容器适配器

文章目录一、容器适配器二、deque类简介1. deque的原理2. deque迭代器3. deque的优点和缺陷4. 为什么选择deque作为stack和queue的底层默认容器一、容器适配器 适配器的概念 适配器是STL六大核心组件之一&#xff0c;它是一种设计模式&#xff0c;该种模式是将一个类的接口转换…

大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s &#x1f4da;️Reference: IoT 边缘计算系列文章 HashiCorp 解决方案 - Nomad Docker 简介 Nomad: 一个简单而灵活的调度器和编排器&#xff0c;…

网络工程课(二)

ensp配置vlan 一、配置计算机ip地址和子网掩码 二、配置交换机LSW1 system-view [Huawei]sysname SW1 [SW1]vlan batch 10 20 [SW1]interface Ethernet0/0/1 [SW1-Ethernet0/0/1]port link-type access 将接口设为access接口 [SW1-Ethernet0/0/1]port default vlan 10 [SW1-E…

【MyBatis】源码学习 04 - 从 MapperMethod 简单分析一条 SQL 的映射操作流程

文章目录前言参考目录学习笔记1、测试代码说明2、binding 包的主要功能3、获取 Mapper 接口实例过程4、SQL 语句执行流程4.1、方法调用器4.2、MapperMethod 绑定方法4.2.1、SqlCommand4.2.2、MethodSignature4.3、MapperMethod#execute前言 本文内容对应的是书本第 13 章的内容…

【亲测2022年】网络工程师被问最多的面试笔试题

嗨罗~大家好久不见&#xff0c;主要是薄荷呢主业还是比较繁忙的啦&#xff0c;之前发了一个面试题大家都很喜欢&#xff0c;非常感谢各位大佬对薄荷的喜爱&#xff0c;嘻嘻然后呢~薄荷调研了身边的朋友和同事&#xff0c;发现我们之前去面试&#xff0c;写的面试题有很多共同的…

C++ Effictive 第6章 继承与面向对象设计 笔记

继承意味着"is-a"。如果B继承自A&#xff0c;那么B is-a A。 子类声明与父类函数同名的函数时&#xff0c;父类函数会被遮掩。 使用using Base::func(args...)&#xff1b;父类所有func的重载函数都在子类中被声明。此举下&#xff0c;如果子类函数与父类函数参数也一…

不要对chatgpt过度反思 第一部分

最近一段时间&#xff0c;chatgpt很热&#xff0c;随意翻一些文章或视频&#xff0c;一些非常整齐一致的怪论&#xff0c;时不时都会冒出来。 为什么这种革命性创新又出现美国&#xff1f; 为什么我国互联网只会电商&#xff0c;没有创新&#xff1f; 为什么我们做不出来&…