MySQL数据库————MVCC
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 |
版本链数据访问规则:
- 判断DB_TRX_ID < up_limit_id,如果成立,则当前事务可以看到DB_TRX_ID所在的记录,反之则进行下一个判断
- 判断DB_TRX_ID >= low_limit_id,如果成立,则代表DB_TRX_ID所在的记录在ReadView生成后才出现的,那么对于当前事务肯定是不允许访问,如果不成立,进入下一步判断
- 判断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会重新生成,导致产生幻读)
相关文章:

MySQL数据库————MVCC
MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表,事务B修改了id2的name字段为李老四,但是没有提交,事务A查询id2的数据,得到name为李老四;事务B发生回滚,id2的数据的name又变回李四&…...

为啥Python多线程爬虫跑的慢?
单线程和多线程进行数据抓取结果还是大有不同的,但是要值得注意的事,如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的事项。 知识点 线程(Thread)也叫轻量级进程࿰…...

万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的
关于作者 英文原版作者:杨靖锋,现任亚马逊科学家,本科毕业于北大,硕士毕业于佐治亚理工学院,师从 Stanford 杨笛一教授。 杨昊桐 译,王骁 修订 感谢靳弘业对第一版稿件的建议,感谢陈三星&am…...

Kaldi语音识别技术(八) ----- 整合HCLG
Kaldi语音识别技术(八) ----- 整合HCLG 文章目录Kaldi语音识别技术(八) ----- 整合HCLGHCLG 概述组合LG.fst可视化 LG.fst组合CLG.fst可视化CLG.fst生成H.fst组合HCLG.fst生成HaCLG.fst生成HCLG.fstHCLG 概述 HCLG min(det(H o min(det(C o min(det(L o G))))) 将…...

day17_异常
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、异常 三、自定义异常 零、 复习昨日 见晨考 一、作业 package com.qf.homework;import java.text.ParseException; import java.text.Simpl…...

vue中把node-sass换成dart-sass方式(解决办法)
目录 一、替换原因 二、art-sass和node-sass的区别 三、替换方法 一、替换原因 因为node-sass和node.js版本关联太紧了,如果这两个版本不匹配,就会起冲突,导致项目无法运行。 ps:值得一提的是node版本和要运行的项目使用的依…...

深入浅出深度学习Pytroch
本文将以通俗易懂的方式,深入浅出地为您揭开深度学习模型构建与训练的面纱: 深度学习数据data模型model损失函数loss优化optimizer可视化visualizer深度学习 数据data 模型model 损失函数loss 优化optimizer 可视化visualizer深度学习数据data模型m…...

CCNP350-401学习笔记(451-500题)
451、what is the function of the LISP map resolver? A. to send traffic to non-LISP sites when connected to a service provider that does not accept nonroutable EIDs as packet sources B. to connect a site to the LISP-capabie part of a core network, publish …...

3年功能测试经验,面试想拿到15k很难吗?
一直觉得经验多,无论在哪都能找到满意的工作,但是现实却是给我打了一个大巴掌!事后也不会给糖的那种... 个人情况 大概介绍一下个人情况,男,本科,三年多测试工作经验,一毕业因为不成熟的经验以…...

【7/101】101次面试之测试技术面试题
01、什么是兼容性测试?兼容性测试侧重哪些方面?答:兼容性测试是一种软件测试类型,它的主要目的是确保一个应用程序在不同的操作系统、不同的浏览器、不同的设备、不同的网络环境等各种环境下能够正常运行,并且不会产生…...

【蓝桥杯每日一题】前缀和算法
🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙我与杀戮之中绽放,亦如黎明的花…...

【C#基础】C# 常用数据结构
序号系列文章4【C#基础】C# 变量和常量的使用5【C#基础】C# 运算符总结6【C#基础】C# 常用语句讲解文章目录前言数据结构的概念1,数组 (Array)1.1,声明并初始化赋值1.2,访问数组元素1.3,Array 类的使用2&am…...

MySql 及MyBatis数据的批量操作
1、Mybatis操作 1、批量更新 <update id"updateCtcc" parameterType"java.util.List">update ctcc set scan1 where id in<foreach collection"list" item"item" index"index" open"(" close")&qu…...

无代码表格数据库——一个企业数字化新物种
商业活动的“非标”地带在现实商业活动中存在大量未被明确界定、规范和标准化的灰色地带,它们不像电信、金融、财会、证券经纪、保险、建筑设计、工程造价等具有高度专业性的业务板块一样有强制的行业标准、规范甚至从业资格证书加持,下文统称其为非标业…...

第十三届蓝桥杯国赛 C++ C组 F 题、Python B组 E 题——近似GCD(AC)
目录1.近似GCD1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.数据范围7.原题链接2.解题思路3.Ac_code1.C2.Python1.近似GCD 1.题目描述 小蓝有一个长度为 nnn 的数组 A(a1,a2,⋯,an)A\left(a_{1}, a_{2}, \cdots, a_{n}\right)A(a1,a2,⋯,an), 数组的子数组被定…...

分享5款小众良心软件,好用到让人惊艳
目前win7渐渐退出视野,大部分人都开始使用win10了,笔者在日常的工作和使用中,为了能够让效率的大提升,下载了不少软件,以下的软件都是个人认为装机必备,而且都是可以免费下载,且没有插件的。 1…...

WAF是什么?一篇文章带你全面了解WAF
WAF是什么?一篇文章带你全面了解WAF 文章目录WAF是什么?一篇文章带你全面了解WAFWAF是什么?一、WAF的工作原理二、WAF的分类三、WAF的特点四、如何选择和部署WAFWAF是什么? Web应用程序防火墙(Web Application Firewa…...

django项目实战八(django+bootstrap实现增删改查)进阶验证码
目录 一、安装第三方 1、pillow 2、第三方字体文件 二、实现生成验证码 1、创建code.py 2、url 3、修改auth.py 4、修改account.py 5、修改login.html 三、验证码校验 1、验证码写入到session 2、修改form下的LoginForm类新增code字段 3、修改login.html 4、修改acco…...

IP 协议
1.IP协议报头如下图:版本号 代表的是当前的IP协议的版本,此处的版本一共有两个取值:v4和v6.本文着重针对v4版本进行解析.首部长度 代表的是整个IP报头的长度,这个报头长度是可变长的,可变长的原因在于报头中的选项,这个属性是一个可有可无的属性,会改变报头长度,它的单位是32bi…...

好用的SQL工具盘点:从学习到工作总有一款适合你
标题一.入坑阶段(学习入门): 这个阶段一般就是小白,想学习SQL语言,然后到处找软件,找免费破解版找半天,找到了半天安装不下来,还可能把自己电脑搞中毒。 其实对于小白来说…...

Memcache介绍
Memcache介绍 Memcache是一个分布式内存对象缓存系统,其功能是为应用程序提供快速和可伸缩的数据存储。memcache使用简单,定义了相对少数几种操作(set,add,replace,get,flush_all等)…...

PTA:C课程设计(1)
山东大学(威海)2022级大一下C习题集(1)1-7-1 求幂级数展开的部分和1-7-2 查询水果价格1-7-3 猜数字游戏1-7-4 特殊a串数列求和1-7-5 成绩统计分析表1-7-6 换硬币1-7-7 验证“哥德巴赫猜想”1-7-1 求幂级数展开的部分和 #include&…...

第二十篇 ResNet——模型讲解
摘要 ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常明显。 模型的创新点在于提出残差学习的思…...

LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目三角形最大周长java多种解法 文章目录1 省份数量题目描述解题思路与代码解法一:深度优先解法二:广度优先解法三:并查集2 三角形的最大周长题目描述解题思路与代码贪心算法:1…...

Vue3通透教程【一】Vue3现状—必然趋势?
文章目录🌟 专栏介绍🌟 Vue默认版本🌟 拥抱Vue3的UI🌟 Vue3显著优势🌟 小彩蛋🌟 写在最后🌟 专栏介绍 凉哥作为 Vue 的忠诚粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相…...

打破数据孤岛,Apache Doris 助力纵腾集团快速构建流批一体数仓架构|最佳实践
福建纵腾网络有限公司(简称“纵腾集团”)成立于 2009 年, 以“全球跨境电商基础设施服务商”为企业定位,聚焦跨境仓储与物流, 为全球跨境电商商户、出口贸易企业、出海品牌商提供海外仓储、商业专线物流、定制化物流等…...

什么是真正的骨传导耳机,骨传导耳机原理
骨传导耳机大多采用后挂耳/夹耳佩戴方式,但现在很多人分不清哪些是骨传导耳机,哪些是气传导耳机。看完这篇教会你辨别哪些是真正的骨传导耳机。 骨传导耳机采用固体传声方式,整个耳机机身都没有传声音孔的设计,主要通过耳机振子发…...

[MySQL]基本数据类型及表的基本操作
哈喽,大家好!我是保护小周ღ,本期为大家带来的是 MySQL 数据库常用的数据类型,数据表的基本操作:创建、删除、修改表,针对修改表的结构进行了讲解,随后是如何向数据表中添加数据,浅浅…...

华为OD机试 - 好朋友(Python) | 机试题+算法思路+考点+代码解析 【2023】
好朋友 题目 在学校中 N个小朋友站成一队 第i个小朋友的身高为height[i] 第i个小朋友可以看到第一个比自己身高更高的小朋友j 那么j是i的好朋友 (要求:j > i) 请重新生成一个列表 对应位置的输出是每个小朋友的好朋友的位置 如果没有看到好朋友 请在该位置用0代替 小朋友…...

SAP ABAP用程序给用户增加SAP_ALL权限
给用户增加SAP_ALL的权限,报表可对basis与abap开发人员对用户权限管理的思路,谢绝用于其它用途,后果自负。 REPORT ZTESTCREATEUSER. data: l_USR04 LIKE USR04 , l_UST04 LIKE UST04 , l_PROFS LIKE USR04-PROFS , l_…...