当前位置: 首页 > news >正文

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

版本链数据访问规则:

  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会重新生成,导致产生幻读)

相关文章:

MySQL数据库————MVCC

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

为啥Python多线程爬虫跑的慢?

单线程和多线程进行数据抓取结果还是大有不同的&#xff0c;但是要值得注意的事&#xff0c;如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的事项。 知识点 线程&#xff08;Thread&#xff09;也叫轻量级进程&#xff0…...

万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的

关于作者 英文原版作者&#xff1a;杨靖锋&#xff0c;现任亚马逊科学家&#xff0c;本科毕业于北大&#xff0c;硕士毕业于佐治亚理工学院&#xff0c;师从 Stanford 杨笛一教授。 杨昊桐 译&#xff0c;王骁 修订 感谢靳弘业对第一版稿件的建议&#xff0c;感谢陈三星&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&#xff09;)))) 将…...

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版本关联太紧了&#xff0c;如果这两个版本不匹配&#xff0c;就会起冲突&#xff0c;导致项目无法运行。 ps&#xff1a;值得一提的是node版本和要运行的项目使用的依…...

深入浅出深度学习Pytroch

本文将以通俗易懂的方式&#xff0c;深入浅出地为您揭开深度学习模型构建与训练的面纱&#xff1a; 深度学习数据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很难吗?

一直觉得经验多&#xff0c;无论在哪都能找到满意的工作&#xff0c;但是现实却是给我打了一个大巴掌&#xff01;事后也不会给糖的那种... 个人情况 大概介绍一下个人情况&#xff0c;男&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;一毕业因为不成熟的经验以…...

【7/101】101次面试之测试技术面试题

01、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f;答&#xff1a;兼容性测试是一种软件测试类型&#xff0c;它的主要目的是确保一个应用程序在不同的操作系统、不同的浏览器、不同的设备、不同的网络环境等各种环境下能够正常运行&#xff0c;并且不会产生…...

【蓝桥杯每日一题】前缀和算法

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;我与杀戮之中绽放&#xff0c;亦如黎明的花…...

【C#基础】C# 常用数据结构

序号系列文章4【C#基础】C# 变量和常量的使用5【C#基础】C# 运算符总结6【C#基础】C# 常用语句讲解文章目录前言数据结构的概念1&#xff0c;数组 &#xff08;Array&#xff09;1.1&#xff0c;声明并初始化赋值1.2&#xff0c;访问数组元素1.3&#xff0c;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…...

无代码表格数据库——一个企业数字化新物种

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

第十三届蓝桥杯国赛 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渐渐退出视野&#xff0c;大部分人都开始使用win10了&#xff0c;笔者在日常的工作和使用中&#xff0c;为了能够让效率的大提升&#xff0c;下载了不少软件&#xff0c;以下的软件都是个人认为装机必备&#xff0c;而且都是可以免费下载&#xff0c;且没有插件的。 1…...

WAF是什么?一篇文章带你全面了解WAF

WAF是什么&#xff1f;一篇文章带你全面了解WAF 文章目录WAF是什么&#xff1f;一篇文章带你全面了解WAFWAF是什么&#xff1f;一、WAF的工作原理二、WAF的分类三、WAF的特点四、如何选择和部署WAFWAF是什么&#xff1f; Web应用程序防火墙&#xff08;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工具盘点:从学习到工作总有一款适合你

标题一.入坑阶段&#xff08;学习入门&#xff09;&#xff1a; 这个阶段一般就是小白&#xff0c;想学习SQL语言&#xff0c;然后到处找软件&#xff0c;找免费破解版找半天&#xff0c;找到了半天安装不下来&#xff0c;还可能把自己电脑搞中毒。 其实对于小白来说&#xf…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...