[MySQL] 事务管理(二) 事务的隔离性底层
事务的隔离性底层
- 1.数据库并发的场景
- 2.读-写
- 2.1MVCC三个变量
- 2.1.1 3个记录隐藏列字段
- 2.1.2 undo日志
- 模拟MVCC
- select 的读取
- 2.1.3 Read View(读视图)
- 3.RR与RC的区别
1.数据库并发的场景
- 读-读:不存在问题,也不需要并发控制
- 读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读
- 写-写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失
2.读-写
一般来说上面的场景中读写的场景占比是最大的。
多版本并发控制(MVCC )是一种用来解决读-写冲突的无锁并发控制。
他会给事务分配一个单向递增的事务ID,为每个修改保存一个版本,版本和事务ID关联,读操作只读取改事务开始前的数据快照,它解决了
- 并发读写数据库的时候,可以做到在读操作的时候不用阻塞写操作,写操作的时候不用阻塞读操作
- 还解决了脏读,幻读,不可重读的问题,但不能解决更新丢失的问题
2.1MVCC三个变量
2.1.1 3个记录隐藏列字段
2.1.2 undo日志
我们把它理解为MySQL 中的一段内存缓冲区,用来保存日志数据的就行
模拟MVCC
假如有一个事务10,他现在要更新数据;
- 先给事务10加锁
- 我们把原始的数据拷贝一份到undo log 中;
- 现在数据库中有两份数据,把张三的名字改成李四后,那么DB_TRX_ID就变成了事务10,回滚指针里面存放的就是undo log中被修改的原始数据的地址。
- 事务10提交,释放锁
现在又多了一个事务11要update李四里面的age改称38
- 先给事务11加锁
- 把要被修改的数据做一份拷贝,到undo log中,
- 现在有两份数据,把age改成38后,DB_TRX_ID变成事务11,回滚指针就变成了undo log中的第一个数据的地址。
这样,我们就有了一个基于链表记录的历史版本链。所谓的回滚,无非就是用历史数据,覆盖当前数据。上面的一个一个版本,我们可以称之为一个一个的快照。
select 的读取
当前读:读取最新的记录,就是当前读。增删改,都叫做当前读
快照读:读取历史版本(一般而言),就叫做快照读。
很多事务在CURD的时候都是当前读,是要加锁的,那么这个时候有select要进行读取最新版本的数据的时候也需要加锁,这就是串行化。
当时如果是快照读,是不受加锁限制的, 所以加锁只针对于最新版本
决定select是当前读还是快照读的是隔离级别;
事务都是原子的。所以,无论如何,事务总有先有后。 那么多个事务在执行中,CURD操作是会交织在一起的。那么,为了保证事务的“有先有后”,是不是应该让不同的事务看到它该看到的内容,这就是所谓的隔离性与隔离级别要解决的问题。也就是先来的事务不应该看到后来事务的数据。
2.1.3 Read View(读视图)
**Read View就是事务进行快照读操作的时候生产的读视图(Read View),**在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID,这个ID是递增的,所以最新的事务,ID值越大)。
Read View在MySQL源码中,就是一个类,本质是用来进行可见性判断的。即当我们某个事务执行快照读的时候,对该记录创建一个Read View读视图,把它比作条件,用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也有可能是该行记录的undo log里面的某个版本的数据。
我们看看它的结构
class ReadView {// 省略...
private:/* 高水位,大于等于这个ID的事务均不可见*/trx_id_t m_low_limit_id;/* 低水位,小于这个ID的事务均可见 */trx_id_t m_up_limit_id;/* 创建该 Read View 的事务ID*/trx_id_t m_creator_trx_id;/* 创建视图时的活跃事务id列表*/ids_t m_ids;/* 配合purge,标识该视图不需要小于m_low_limit_no的UNDO LOG,* 如果其他视图也不需要,则可以删除小于m_low_limit_no的UNDO LOG*/trx_id_t m_low_limit_no;/* 标记视图是否被关闭*/bool m_closed;// 省略...
};
我们在实际读取数据版本链的时候,可以读取到每一个版本对应的事务ID,即:当前记录的DB_TRX_ID;
我们现在手里面有的东西就有,当前快照读的ReadView 和 版本链中的某一个记录的DB_TRX_ID.
问题:当前快照读,应不应该读取到当前版本的记录
通过版本对应的事务ID与Read View的ID的大小进行判断
注意:视图是一个对象,初始化之后就不会在改变了。
我们能看到的额数据应该是:
- up_limit_id>DB_TRX_ID
- 同一个时期活跃的ID,但是不在我的m_ids中(这个事务在我之前已经提交了)
3.RR与RC的区别
- 正是Read View生成时机的不同,从而造成RC,RR级别下快照读的结果的不同
- 在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View,将当前系统活跃的其他事务记录起来
- 此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用过快照读,那么之后的快照读使用的都是同一个Read View,所以对之后的修改不可见;
- 即RR级别下,快照读生成Read View时,Read View会记录此时所有其他活动事务的快照,这些事务的修改对于当前事务都是不可见的。而早于Read View创建的事务所做的修改均是可见
- 而在RC级别下的,事务中,每次快照读都会新生成一个快照和Read View,这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因
- 总之在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View,之后的快照读获取的都是同一个Read View。
- 正是RC每次快照读,都会形成Read View,所以,RC才会有不可重复读问题。
相关文章:
[MySQL] 事务管理(二) 事务的隔离性底层
事务的隔离性底层 1.数据库并发的场景2.读-写2.1MVCC三个变量2.1.1 3个记录隐藏列字段2.1.2 undo日志 模拟MVCCselect 的读取2.1.3 Read View(读视图) 3.RR与RC的区别 1.数据库并发的场景 读-读:不存在问题,也不需要并发控制读-写…...
【Netty篇】EventLoopGroup 与 EventLoop 详解
目录 开场白:话说 Netty 江湖第一段:EventLoopGroup——“包工头”的角色第二段:EventLoop——“身怀绝技的工人”第三段:EventLoop 如何处理 I/O 事件、普通任务和定时任务第四段:Handler 执行中如何换人?…...
vscode连接windows服务器出现过程试图写入的管道不存在
优云智算平台的windows 1. 确保 Windows 已启用 OpenSSH 服务器 Get-WindowsCapability -Online | Where-Object Name -like OpenSSH.Server* 如果 State 是 NotPresent,说明未安装。 如果 State 是 Installed,说明已安装。 安装 OpenSSH Server&am…...
Windows VsCode Terminal窗口使用Linux命令
背景描述: 平时开发环境以Linux系统为主,有时又需要使用Windows系统下开发环境,为了能像Linux系统那样用Windows VsCode,Terminal命令行是必不可少内容。 注:Windows11 VsCode 1.99.2 下面介绍,如何在V…...
19【干获】如何快速在GIS某个图斑中抠出空洞
应用场景:在图斑中扣取空洞,很多时候是因为CAD数据在转换为GIS文件时,由于CAD作图不规范,例如填充本身不严谨,导致转换后,一个大地块包含的小地块范围不见了,只有大地块;或者会存在两…...
基于YOLO11的跌倒检测报警系统
基于YOLO11的跌倒检测报警系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】完整的视频/摄像头/图片检测与报警功能 【技术栈】 ①:系统环境:Windows/MacOS/Linux通用 ②:开发环境:Py…...
十、自动化函数+实战
Maven环境配置 1.设计测试用例 2.创建空项目 1)添加需要的依赖pom.xml <dependencies> <!-- 截图配置--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</…...
面向初学者的JMeter实战手册:从环境搭建到组件解析
🌟 大家好,我是摘星! 🌟 今天为大家带来的是面向初学者的JMeter实战手册:从环境搭建到组件解析,废话不多说,让我们直接开始~ 目录 1. JMeter简介 2. JMeter安装与配置 2.1. 安装 2.2.…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——PCIE2.0 x1接口测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——PCI…...
云函数采集架构:Serverless模式下的动态IP与冷启动优化
在 Serverless 架构中使用云函数进行网页数据采集,不仅能大幅降低运维成本,还能根据任务负载动态扩展。然而,由于云函数的无状态特性及冷启动问题,加上目标网站对采集行为的反制措施(如 IP 限制、Cookie 校验等&#x…...
UE5 设置物体的位置
UE的位置设置和untiy不同,UE的对象分为根物体和组件,他们的设置方法不同 对于蓝图根物体 可以直接当作Actor处理,设置它的世界位置 对于蓝图的组件 设置世界位置: 设置相对位置...
【adb】bat批处理+adb 自动亮屏,自动解锁屏幕,启动王者荣耀
准备adb 下载 需要确认是否安装了adb.exe文件,可以在: 任务管理器 -->详细信息–>找一下后台运行的adb 安装过anroid模拟器,也存在adb,例如:雷电安装目录 D:\leidian\LDPlayer9 单独下载adb 官方下载地址:[官方网址] 下载目录文件: 测试adb USB连接手机 首先在设置界…...
【计算机网络】3数据链路层①
这篇笔记专门讲数据链路层的功能。 2.功能 数据链路层的主要任务是让帧在一段链路上或一个网络中传输。 2.1.封装成帧(组帧) 解决的问题:①帧定界②帧同步③透明传输 实现组帧的方法通常有以下种。 2.1.1.字符计数法 原理:在每个帧开头,用一个定长计数字段来记录该…...
OSPF路由协议
OSPF(开放式最短路径优先) 1、回顾 rip:v1(广播发送、路由自动汇总,不支持可变长子网)v2(组播发送,默认不汇总路由,支持可变长子网)封装在UDP的520端口中&a…...
线代第二章矩阵第三、四课:矩阵乘法和方阵的幂
文章目录 矩阵的乘法矩阵的可交换方阵的幂 矩阵的乘法 (1)乘法的前提条件: 第一个矩阵的列数等于第二个矩阵的行数 (2)结果阵的形状: 结果矩阵的行数=第一个矩阵的行数 结果矩阵的列数=第二个矩阵的列数 乘法不满足交换律: &am…...
if constexpr
if constexpr if constexpr 是 C17 引入的一个强大的特性,它允许在编译时根据条件选择性地编译代码块。与普通的 if 语句不同,if constexpr 的条件必须是一个编译时可计算的常量表达式(constexpr 表达式)。如果条件为 true&#…...
JAVA程序实现mysql读写分离并在kubernetes中演示
1 概述 对数据进行读写分离,可以将读流量从主数据库中剥离出来,进一步降低读操作对写操作的影响。读写分离的实现可以有多种方式,例如通过proxySQL、mycat等中间件来实现,也可以在应用进程内实现。本文介绍JAVA程序通过spring框架…...
HarmontOS-ArkUI V2状态 !!语法糖 双向绑定
什么是双向绑定 双向绑定指的是在组件间数据的双向绑定。当一个值无论是在父组件还是子组件中改动都会在这两层中都更新界面。 回顾过往的“双向绑定”实现方式 靠@Event装饰回调函数 一般是对于@Param修饰的状态变量。当子组件发生某个动作的时候,调用某个父组件传递过来的…...
Linux驱动开发进阶(十)- I2C子系统BSP驱动
文章目录 1、前言2、I2C总线注册3、I2C设备注册4、I2C驱动注册总结 1、前言 学习参考书籍以及本文涉及的示例程序:李山文的《Linux驱动开发进阶》本文属于个人学习后的总结,不太具备教学功能。 2、I2C总线注册 和其它总线驱动一样,I2C驱动…...
Vue 3 路由配置使用与讲解
在现代前端开发中,单页应用(SPA)已成为主流趋势,Vue.js 作为一款优秀的 JavaScript 框架,在构建 SPA 方面表现出色。Vue Router 作为 Vue.js 官方的路由管理器,与 Vue.js 核心深度集成,极大地简…...
7系列fpga在线升级和跳转
一、常见跳转方式 1,一般FPGA只要上电,就会自动从外部flash的0地址加载程序。2,而我们所谓的在线式升级就是在flash0地址放一个程序(boot/golden image),然后在后面再放一个程序(app/update im…...
解决靶机分配的 IP 地址与 Kali 机器静态 IP 地址冲突的方法
在网络安全学习或渗透测试中,经常会遇到靶机和 Kali 机器处于同一网络环境的情况。如果靶机通过 DHCP 自动获取的 IP 地址与 Kali 机器手动设置的静态 IP 地址发生冲突,就会导致网络通信异常,例如无法正常 ping 通或访问目标。本文将详细介绍…...
LLM做逻辑推理题 - 飞机事件
题目: 有N架一样的飞机停靠在同一个机场,每架飞机都只有一个油箱,每箱油可使飞机绕地球飞半圈。注意:天空没有加油站,飞机之间只是可以相互加油。如果使某一架飞机平安地绕地球飞一圈,并安全地回到起飞时的机场&#x…...
【Netty4核心原理】【全系列文章目录】
文章目录 一、前言二、目录 一、前言 本系列虽说本意是作为 《Netty4 核心原理》一书的读书笔记,但在实际阅读记录过程中加入了大量个人阅读的理解和内容,因此对书中内容存在大量删改。 本系列内容基于 Netty 4.1.73.Final 版本,如下…...
SAP ECCS 标准报表 切换为EXCEL电子表格模式
在解决《SAP ECCS标准报表在报表中不存在特征CG细分期间 消息号 GK715报错分析》问题过程中通过DEBUG方式参照测试环境补录数据后,不再报GK715错误,此时用户要的很急,要出季报。要求先把数据导出供其分析出季报。 采用导出列表方式ÿ…...
开源推荐#6:可爱的临时邮箱服务
大家后,我是 jonssonyan。 我们的邮箱常常被各种推广邮件、验证码甚至垃圾邮件淹没。每次注册新服务或临时需要一个邮箱时,都担心自己的主邮箱地址被泄露或滥用?也许你用过一些公共的临时邮箱服务,但数据隐私和可控性总是让人不那…...
SpringBoot企业级开发之【用户模块-更新用户密码】
具体内容: 依旧是查看接口文档信息: 开发思路: 实操: 1.controller //更新用户密码PatchMapping("/updatePwd")public Result updatePwd(RequestBody Map<String,String> params) {//1.校验参数String oldPwdparams.get(…...
MyBatis-Plus 通过 ID 更新数据为NULL总结
在使用 MyBatis-Plus 通过 ID 更新数据时,若需将字段值设为 null,可参考以下解决方案: 方法一:使用 TableField 注解 在实体类字段上添加注解,指定更新策略为忽略非空检查: public class User {TableFie…...
SpringCloud Alibaba微服务工程搭建
前言 在讲微服务工程的搭建之前,我们先分析下为什么要使用微服务呢? 1、单体应用的痛点 维护困难:代码臃肿,牵一发而动全身。扩展性差:无法按需扩展特定功能,只能整体扩容。技术栈僵化:难以引…...
mobaXterm添加自定义内容按钮方法、mobaXterm宏的另一种使用方式、mobaxterm免输密码自动su到root用户
文章目录 说明添加自定义按钮内容方式完整流程说明root密码demo一键suroot 说明 就是给mobax添加secureCRT工具中的自定义按钮。 但发现mobax中的按钮其实是固定功能,并不能自定义编辑按钮内容。 添加自定义按钮内容方式 完整流程说明 虽然mobax不能直接像CRT那…...
04.Python代码NumPy-通过索引或切片来访问和修改
04.Python代码NumPy-通过索引或切片来访问和修改 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ python语法…...
继承:(开始C++的进阶)
我们今天来学习C的进阶: 面向对象三大特性:封装,继承,多态。 封装我们在前面已经学了,我们细细理解,我们的类的封装,迭代器的封装(vector的迭代器可以是他的原生指针,li…...
【本地MinIO图床远程访问】Cpolar TCP隧道+PicGo插件,让MinIO图床一键触达
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言MinIO本地安装与配置cpolar 内网穿透PicGo 安装MinIO远程访问总结互动致谢参考目录…...
OpenCV数组的操作
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 这里的数组不是普通意义上的数组。核心模块Core专门提供了一些全局函数用于对数组(矩阵)进行操作。常用函数如表3-2所示。 3.2.1 寻找数组中最小值和最大值的位置(minMaxL…...
python idea pycharm ModuleNotFoundError: No module named ‘bin‘
一、解决方案 1.修正运行配置中的环境变量 2.打开运行配置: 3.点击 IDEA 右上角配置下拉菜单 -> Edit Configurations。 4.选择 Django Server 配置(或自定义的调试配置)。 5.移除错误变量: 5.1在 Environment var…...
自动驾驶创建场景(just soso)
使用 Driving Scenario Designer 创建弯道驾驶场景并导出模型的详细步骤整理与补充说明: 步骤 1:打开应用程序 启动 MATLAB在 MATLAB 命令窗口中输入以下命令,打开驾驶场景设计器:matlabCopy CodedrivingScenarioDesigne…...
大模型在轮状病毒肠炎预测及临床方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、轮状病毒肠炎概述 2.1 病毒特性与传播途径 2.2 临床症状与病理机制 2.3 流行病学特征 三、大模型技术原理及在医疗领域应用现状 3.1 大模型基本原理 3.2 医疗领域应用案例分析 3.3 大模型应用于轮状病毒…...
从 PyTorch 到 ONNX:深度学习模型导出全解析
在模型训练完毕后,我们通常希望将其部署到推理平台中,比如 TensorRT、ONNX Runtime 或移动端框架。而 ONNX(Open Neural Network Exchange)正是 PyTorch 与这些平台之间的桥梁。 本文将以一个图像去噪模型 SimpleDenoiser 为例&a…...
移动硬盘突然打不开紧急救援指南:从排查到完整恢复
突发状况的典型特征 当移动硬盘突然打不开时,用户常会遇到多种异常表现:接入电脑后硬盘指示灯虽亮但无法识别、系统反复提示“设备未连接成功”或弹出“磁盘结构损坏”的警告。部分情况下,资源管理器中的盘符虽可见,但双击后显示…...
HarmonyOS学习 实验九:@State和@Prop装饰器的使用方法
HarmonyOS应用开发:父子组件状态管理实验报告 引言 在HarmonyOS应用开发领域,组件之间的状态管理是一个至关重要的概念。通过有效的状态管理,我们可以确保应用的数据流动清晰、可预测,从而提升应用的稳定性和可维护性。本次实验…...
lodash-es 详解
import { cloneDeep } from lodash-es 是使用 ES Modules 语法从 lodash-es 包中按需导入 cloneDeep 函数。这是现代前端开发中推荐的使用 Lodash 的方式: 1. lodash-es 是什么? 它是 Lodash 的 ES Modules 版本(普通 lodas…...
使用nvm install XXX 下载node版本时网络不好导致npm下载失败解决方案
若nvm install ***安装报错解决方案: 离线安装Node.js npm,可直接下载Node.js 14.21.3的完整离线包(含npm): 访问 Node.js历史版本下载页:https://nodejs.org/download/release/v14.21.3/ 下载 node-v14.…...
VScode+OpenOCD+HTOS栈回溯在国产mcu芯片上完全调试
VScodeOpenOCDCmakeHTOS栈回溯在国产32芯片上完全调试 说实话用的都是HAL库开发的,flash链接文件用的都是stm32的,只能说国产芯片抄的基本完全一样了。具体芯片是什么就不介绍了,看过文章就能猜出来是哪家的了。代码开源在Gitee上了。https:…...
2025年最新版动漫短剧系统开发小程序app教程,源码部署上线
以下是动漫短剧系统开发上线的详细教程,包含从0到1的全流程: 一、需求分析(关键:明确核心功能) 核心功能清单: 用户端:短视频浏览、弹幕评论、收藏/点赞、创作者关注、付费订阅。创作者端&am…...
Java练习——day2(集合嵌套)
文章目录 练习1练习2练习3 练习1 给定一个字符串列表List words,统计每个单词出现的次数,并用Map<String, Integer>存储结果。 示例代码: import java.util.*;public class WordCount {public static void main(String[] args) {// 示…...
国产CPU处理器性能实测:龙芯/海光/兆芯/华颉VS英特尔和AMD!
最近后台总收到粉丝留言:"现在国产CPU到底行不行?想换电脑又怕国产的不够强"。今天咱们就掏心窝子聊聊这个话题——国产CPU处理器到底是"弯道超车"还是"贴牌组装"?性能真能和英特尔i5、AMD锐龙掰手腕吗&#x…...
Excel自定义函数取拼音首字母
1.启动Excel 2003(其它版本请仿照操作),打开相应的工作表; 2.执行“工具 > 宏 > Visual Basic编辑器”命令(或者直接按“AltF11”组合键),进入Visual Basic编辑状态; 3.执行“…...
Vue3 SSR生物启发架构:仿生渲染与DNA流式编码
一、神经元弹性调度网络 1.1 突触连接式渲染集群 1.2 生物能效对比表 调度模式能耗(kWh/万次)突触延迟容错阈值信息熵利用率轮询调度4.2220ms60%35%蚁群算法2.8150ms75%48%神经形态调度0.945ms93%82%DNA协进化调度0.312ms99.9%95% 二、DNA流式编码协议 2.1 四碱基序列转换器…...
git的上传流程
好久没使用git 命令上传远程仓库了。。。。。温习了一遍; 几个注意点--单个文件大小不能超过100M~~~ 一步步运行下面的命令: 进入要上传的文件夹内,点击git bash 最终 hbu的小伙伴~有需要nndl实验的可以自形下载哦...
C++学习记录:
今天我们来学习一门新的语言,也是C语言最著名的一个分支语言:C。 在C的学习中,我们主要学习的三大组成部分:语法、STL、数据结构。 C的介绍 C的历史可追溯至1979年,当时贝尔实验室的本贾尼斯特劳斯特卢普博士在面对复杂…...