【MySQL】InnoDB中的MVCC
目录
- 1、背景
- 2、设置事务的隔离级别
- 3、MVCC
- 【1】版本链
- 【2】ReadView
- 【3】ReadView的生成时机
- 4、总结
1、背景
MVCC叫做多版本并发控制,通过维护数据的多个历史版本实现读写分离:读操作访问快照版本,无需加锁,避免阻塞写操作;写操作创建新版本,不影响其它事务的读操作。这种机制支持了读已提交和可重复读两种事务隔离级别,InnoDB中是通过隐藏列事务id、版本链、Read View实现的MVCC。
2、设置事务的隔离级别
设置事务隔离级别可以通过修改配置文件和通过sql语句,修改的隔离级别有4种:读未提交、读已提交、可重复读、串行化,修改配置文件可以永久生效,查看配置文件中的隔离级别如下:
[root@xxx xxx]# cat /xxx/my.cnf | grep 'transaction_isolation'
transaction_isolation = READ-COMMITTED
通过sql语句修改是临时生效的,有3种修改方式,一个是会话级设置,只影响当前连接,例如:
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)
另一个是全局设置,影响所有连接,例如:
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Query OK, 0 rows affected (0.00 sec)
最后一个是仅对下一个事务生效,例如:
mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)
3、MVCC
【1】版本链
之前讲过隐藏列:row_id、trx_id、roll_pointer,其中row_id不一定存在,当没有主键和唯一索引时,row_id才存在,trx_id是事务id,roll_pointer指向undo日志,通过roll_pointer就可以组成一条版本链,接下来通过如下表和数据来说明:
mysql> show create table student;
+---------+-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------+
| Table | Create Table|
+---------+-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
+----+------+
1 row in set (0.00 sec)
接下来分别在两个事务中更新数据,假设事务id分别为20和50:
时间顺序 | 事务A,事务id=20 | 事务B,事务id=50 |
---|---|---|
t1 | 开始事务 | 开始事务 |
t2 | UPDATE student SET name = ‘李四’ WHERE id = 1; | |
t3 | 提交事务 | |
t4 | UPDATE student SET name = ‘王五’ WHERE id = 1; | |
t5 | 提交事务 |
此时版本链如下:
name为王五的代表最新记录,name为李四和张三的为undo日志。
【2】ReadView
对于未提交读的隔离级别事务来说,由于可以读到未提交事务修改的记录,直接读取最新的版本就好了;对于串行化隔离级别的事务来说是使用加锁的方式来访问记录的;对于读已提交和可重复读隔离级别的事务来说,只能读到已提交事务的结果。所以核心问题就是版本链中哪一个版本对当前事务是可见的,所有就有了ReadView,ReadView中包含4个部分:
名称 | 含义 |
---|---|
m_ids | 生成ReadView时当前系统中活跃的读写事务id列表 |
min_trx_id | m_ids中的最小值 |
max_trx_id | 分配给下一个事务的id值,不是m_ids中的最大值 |
creator_trx_id | 生成ReadView的事务id,只读事务中为0 |
通过ReadView的属性,我们就能判断对记录版本链中的哪一个版本可见,判断规则如下:
1、如果被访问版本的trx_id与ReadView的中的creator_trx_id相同,说明当前事务再访问自己修改的记录,所以该版本可以被当前事务访问。
2、如果被访问版本的trx_id小于ReadView的中的min_trx_id值,说明生成该版本的事务在当前事务之前已经提交,所以该版本可以被当前事务访问。
3、如果被访问版本的trx_id大于ReadView的中的max_trx_id值,表明生成该版本的事务在当前事务之后开启,所以该版本不可以被当前事务访问。
4、如果被访问的版本的trx_id在ReadView的min_trx_id和max_trx_id之间,需要判断trx_id是否在m_ids中,在就说明该版本的事务还是活跃的,不可以被访问;不在就说明该版本已经提交,可以被访问。
如果某个版本的数据对当前事务不可见,就顺着版本链去判断下一个版本的数据,一直到最后一个版本,如果最后一个版本也不可见,那查询结果就不包含这条记录。
【3】ReadView的生成时机
隔离级别 | 生成ReadView时机 |
---|---|
读已经提交 | 每次读取数据前都生成一个ReadView |
可重复读 | 第一次读取数据时生成一个ReadView |
4、总结
MVCC是一种数据库并发控制技术,通过维护数据的多个历史版本实现读写操作的并行化,从而提升性能并解决事务隔离性问题。
相关文章:
【MySQL】InnoDB中的MVCC
目录 1、背景2、设置事务的隔离级别3、MVCC【1】版本链【2】ReadView【3】ReadView的生成时机 4、总结 1、背景 MVCC叫做多版本并发控制,通过维护数据的多个历史版本实现读写分离:读操作访问快照版本,无需加锁,避免阻塞写操作&am…...
从DeepSeek到Qwen,AI大模型的移植与交互实战指南
在不久前发布的《技术实战 | OK3588-C开发板上部署DeepSeek-R1大模型的完整指南》一文中,小编为大家介绍了DeepSeek-R1在飞凌嵌入式OK3588-C开发板上的移植部署、效果展示以及性能评测,本篇文章不仅将继续为大家带来关于DeepSeek-R1的干货知识࿰…...
蓝桥杯Java组国赛G题(01背包问题的变形)
题目 解题思路 首先,解决此题的前置知识是需要掌握普通的 01 背包问题。当然,这题肯定不可能这么简单。题目相对于 01 背包来说,唯一的区别在于小蓝可以使用 1 次魔法。我们只需要多加一维状态记录是否使用了魔法即可。下面考虑动态规划&…...
QCW模式:准连续波驱动在VCSEL激光器中的技术解析与应用价值
点击下面图片,为您提供全新的嵌入式学习路线 文章目录 一、QCW模式的定义与工作原理二、QCW模式的技术优势三、典型应用场景分析四、PLD850-5mW-MV的QCW性能亮点五、总结 一、QCW模式的定义与工作原理 QCW(Quasi-Continuous Wave)…...
C++List模拟实现|细节|难点|易错点|全面解析|类型转换|
目录 1.模拟代码全部 2.四大块代码理解 1.最底层:ListNode部分 2.第二层:ListIterator部分 3.第三层:ReserveListIterator部分 4最终层:List 1.模拟代码全部 using namespace std; template<class T> struct ListNode …...
【安全】记录钓鱼邮件中木马病毒的分析溯源
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、收到一封邮件,与以往钓鱼网站形式不同,这次是给了一个exe可执行文件。毫无疑问,肯定是植入木马用的。 下载后&am…...
三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&…...
AI 与 IT 从业者:共舞还是取代?
在当今数字化浪潮的汹涌冲击下,AI 的出现犹如一颗划破夜空的璀璨星辰,照亮了科技发展的新方向,也引发了无数关于未来职业走向的讨论。尤其是对于 IT 从业者而言,仿佛站在了一个十字路口,前方是机遇与挑战交织的未知旅程…...
【计算机网络中的奈氏准则与香农定理】
文章目录 一、前言二、奈氏准则1. 概念2. 奈氏准则公式3. 奈氏准则的意义 三、香农定理1. 概念2. 香农定理公式3. 香农定理的意义 四、奈氏准则与香农定理的对比五、应用示例1. 奈氏准则示例2. 香农定理示例 六、总结 一、前言 在计算机网络中,数据的传输速率与信道…...
湖南(源点咨询)市场调研 商业综合体定位调研分享(上篇)
该项目位于某新一线城市的城市副中心区域,系一个正在发展中的中央居住区,项目本身是一个涵盖社区综合服务中心、商业、文体活动中心、卫生服务、社区养老等多功能复合的公共配套项目,本次调研主要针对其商业(及其他可商用的&a…...
鸿蒙ArkTs/c++/RepalcePioneer/base64.us之Base64编码解码的是非
狗血现象: 同一字符串原文使用 1、RepalcePioneer(一款Windows平台的字符串工具) 2、鸿蒙ArkTs自带base64编码方法 3、https://base64.us(一款在线base64工具) 来编码,得到编码串不一样,后…...
《Linux运维实战:Ubuntu 22.04使用pam_faillock实现登录失败处理策略》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、背景信息 在ubuntu 22.04中,pam_tally2模块已被弃用,取而代之的是pam_faillock模块。因此…...
如何让DeepSeek-R1在内网稳定运行并实现随时随地远程在线调用
前言:最近,国产AI圈里的新星——Deepseek,简直是火到不行。但是,你是不是已经对那些千篇一律的手机APP和网页版体验感到腻味了?别急,今天就带你解锁一个超炫的操作:在你的Windows电脑上本地部署…...
2.1-WAF\CDN\OSS\反向代理\负载均衡
WAF:就是网站应用防火墙,有硬件类、软件类、云WAF; 还有网站内置的WAF,内置的WAF就是直接嵌在代码中的安全防护代码 硬件类:Imperva、天清WAG 软件:安全狗、D盾、云锁 云:阿里云盾、腾讯云WA…...
matplotlib学习
开始学习Python数据可视化 一.基础绘图函数 1.创建画布与坐标轴 import matplotlib.pyplot as plt# 创建画布和坐标轴 fig, ax plt.subplots() # 默认1行1列,返回Figure对象和Axes对象 2.绘制线图 x [1, 2, 3, 4] y [10, 20, 15, 25]# 绘制线图 ax.plot(x,…...
Go 语言标准库中math模块详细功能介绍与示例
Go语言的 math 模块提供了丰富的数学函数和常量,涵盖基本运算、三角函数、指数、对数、取整、特殊值等。以下是核心方法及示例说明: 1. 基本数学运算 math.Abs 取绝对值(仅 float64)。 fmt.Println(math.Abs(-3.5)) // 输出:…...
RabbitMQ三种队列深度解析:区别、场景与未来趋势
嗯,用户让我分析RabbitMQ三种队列的区别、应用场景、技术原理和未来趋势,还要写一篇三千字的文章。首先,我需要回顾一下搜索结果,看看有哪些资料可用。 根据搜索结果,RabbitMQ的三种队列是经典队列(Classi…...
15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&…...
0328-内存图2
是否正确待定: Perso类 package com.qc.内存图2;public class Perso {public int age;public String name;public static int flag;public void m1() {}public static void m2() {}Overridepublic String toString() {return "Perso [age" age "…...
最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1: 输入:nums [-1,2,1,-4], target 1 输出:…...
d2025328
一、sql-判断三角形 610. 判断三角形 - 力扣(LeetCode) 用一下if加上判断条件 select x,y,z,if(xy > z and xz > y and yz > x and x-y < z and x-z < y and y-z < x,Yes,No) as triangle from Triangle 二、按照分类统计薪水 190…...
初识MySQl · 内置函数
目录 前言: 日期类函数 字符串函数 数学类函数 其他函数 前言: 在前文的学习我们已经简单了解了部分函数,比如count()函数什么的,今天我们主要是笼统的学习一下MySQL中的函数,仅仅从使用的角度来学习,…...
(C语言)指针运算 习题练习1.2(压轴难题)
在上一张已经练习了三道习题,小试牛刀了,那么在本章在来几题,练练手。(习题三是压轴难题) 习题一 int main() {int aa[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 (int*)(&aa 1);int* ptr2 (int*)…...
视频AI赋能水利行业生态治理,水电站大坝漂浮物实时监测与智能预警方案
水电站大坝周边水域垃圾漂浮物不仅影响水质,还可能对大坝设施运行、水生态环境造成威胁。传统依靠人工巡检的方式效率低、存在监测盲区,难以实时全面地掌握漂浮物情况。借助EasyCVR视频汇聚平台与TSINGSEE青犀AI算法中台构建智能化监测方案,能…...
方阵幂次(矩阵快速幂)
#include <bits/stdc.h> using namespace std;int n; vector<vector<int>> fuc(vector<vector<int>> a,vector<vector<int>> b){ // 矩阵乘法函数vector<vector<int>> f(n,vector<int>(n));for(int i0;i<n;i){…...
【Uni-App】嵌入悬浮球全局组件的详细教程和防踩坑点
一、前言 近期接到一个业务需求是为为h5页面嵌入悬浮球,而且还得是全局化(这样所有页面就可以看见了),在开发的过程中也遇到一些坑,在此和大家一起学习、讨论。 二、准备工作 下载悬浮球组件代码 悬浮球 - DCloud …...
第十六章 图
1.为什么要有图 前面学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时,这里我们就用到了图 import java.util.ArrayList; import java.util.Arrays;public class Graph {private int[][]edg…...
Ubuntu 系统无法远程连接?完整排查指南与解决方案
远程连接 Ubuntu 系统是服务器管理和开发中的常见需求,但有时会遇到无法连接的问题。本文整理常见原因及解决方法,涵盖 SSH 服务配置、防火墙规则、网络设置等关键环节,助您快速定位问题。 检查 SSH 服务状态 SSH(Secure Shell) 是远程连接的核心服务。若未安装或未运行,…...
将网络安全和第三方风险管理与业务目标相结合
在网络安全风险领域,我们经常遇到与企业语言不通的问题。这可能导致网络安全风险管理计划得不到支持。当发现网络安全风险时,困难在于以符合组织语言和目标的方式来表达它。 第三方风险属于另一个灰色地带。在组织内部,许多利益相关者&#…...
加油站小程序实战教程02宫格导航
目录 引言1 应用创建2 搭建页面布局3 大模型生成图标最终效果 引言 在《加油站小程序实战教程01》中我们详细介绍了站点基本信息数据维护功能的搭建。有了数据之后就需要考虑小程序展示部分该如何搭建,本篇我们介绍一下应用的创建、页面布局以及数据绑定的过程。 …...
es6的箭头函数与普通函数的区别,箭头函数的this通常指向哪里,箭头函数可以用作构造函数吗?
ES6 的箭头函数与普通函数的区别 箭头函数(Arrow Function)和普通函数有一些重要的区别,主要体现在以下几个方面: 1. 语法简洁性 - 箭头函数的语法更简洁,不需要使用 function 关键字。 - 普通函数需要使用 functi…...
工作记录 2017-03-10
工作记录 2017-03-10 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了payment detail和patient insurance的health plan的输入方式。 2、new payment detail时,增加了allowable的处理。 3、选择payer的窗体,增…...
如何一键安装所有Python项目的依赖!
在开发项目时,常常需要在多个环境中安装各种依赖。对开发者来说,每次手动一个个安装这些依赖是不是很麻烦?😅 其实有个超简单的办法!只需要一个脚本,就能快速解决问题!💡 这就是我们…...
linux的基础命令
目录 1. 文件和目录操作 ls ls -l ls -a pwd touch haha.txt mkdir 113 cd . 和 cd .. cd ~ echo "hello world" >> test.c cat test.txt mv rm 2. 压缩与解压 zip test.zip test.c unzip test.zip -d /root/113 tar czf lesson4.tgz less…...
Redis数据持久化机制 + Go语言读写Redis各种类型值
Redis(Remote Dictionary Server)作为高性能的键值存储系统,凭借其丰富的数据类型和原子性操作,成为现代分布式系统中不可或缺的组件。 1、Redis支持的数据类型 Redis支持的数据类型可归纳为以下9类: String&#x…...
HackMyVM-Demons
目录 信息搜集漏洞利用提权 信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.21.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-03-27 23:38 EDT Nmap scan report for 192.168.21.1 (192.168.21.1) Host is up (0.0016s latency). MAC Add…...
Python Random 模块使用完全指南
一、模块基础与核心功能 1. 模块导入与初始化 所有随机操作需先导入模块: import random # 标准导入方式 import random as rd # 别名导入(推荐)核心原理:默认基于梅森旋转算法生成伪随机数,可通过random.seed()设…...
前端技术有哪些
一、基础技术 HTML 页面结构标记语言,最新版本为 HTML5。 CSS 样式设计语言,扩展技术包括: CSS 预处理器:Sass、Less、Stylus。CSS 框架:Bootstrap、Tailwind CSS、Bulma。原子化 CSS:Windi CSS、UnoCSS。…...
Python二分查找【清晰易懂】
1. 二分查找是什么? 想象你在玩“猜数字”游戏: 对方心里想一个 1~100 的数字,你每次猜一个数,对方会告诉你是“大了”还是“小了”。 最快的方法:每次都猜中间的数!比如第一次猜50,如果大了&…...
【数据分享】基于联合国城市化程度框架的全球城市边界数据集(免费获取/Shp格式)
在全球城市化进程不断加快的今天,如何精准定义和测量“城市”成为关键问题。不同国家和机构采用不同的标准,导致全球城市化水平的统计结果存在较大差异。同时,由于数据来源分散、标准不统一,获取一套完整、可比的全球城市边界数据…...
ExpTimerApcRoutine函数分析之作用是ActiveTimerListHead里面移除定时器_etimer
第一部分: VOID ExpTimerApcRoutine ( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ) /* Routine Description: This function is the special …...
Linux环境下安装部署Docker
windows下连接Linux: 打开终端: //ssh远程连接 ssh root192.168.xx.xx//输入账号密码 root192.168.xx.xxs password: ssh连接成功! 安装Docker: //安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 …...
深度赋能!北京智和信通融合DeepSeek,解锁智能运维无限可能
在数字化飞速发展的今天,传统运维模式面临着设备规模激增、故障复杂度攀升、人工响应滞后等多重挑战。随着DeepSeek、腾讯元宝等AI大模型的兴起,为传统运维模式带来了新的变革。 北京智和信通基于DeepSeek大模型技术,将AI和运维场景深度融合&…...
mysql死锁排查解决
今天数据库突然报错[40001][1213] Deadlock found when trying to get lock; try restarting transaction 一看就是死锁 阿里实列会显示类似sql:UPDATE goods SET num num - 1 WHERE id2 AND num > 1; 一看sql这不是扣减库存操作吗? 为什么这sql会出现死锁??…...
Linux | i.MX6ULL 终结者学习指南(1)
01 一 光盘资料介绍 跟我一起成为嵌入式Linux大佬,开干 02 接下来我们一起学习。 01_开发及烧写工具 (Linux 镜像烧写工具、交叉编译器、裸机镜像制作工具) 1.交叉编译器 (ARM 交叉编译器) 2.裸机镜像制作…...
NX二次开发刻字功能——布尔运算
刻字功能在经历、创建文本、拉伸功能以后就剩下布尔运算了。布尔运算的目的就是实现文本时凸还是凹。这部分内容很简单。 1、首先识别布尔运算的类型,我这里用到一个枚举类型的选项,凸就是布尔求和,凹就是布尔求差。 2、其放置位置为创建拉伸…...
SpringAI与JBoltAI深度对比:从工具集到企业级AI开发范式的跃迁
一、Java生态下大模型开发的困境与需求 技术公司的能力断层 多数企业缺乏将Java与大模型结合的标准开发范式,停留在碎片化工具使用阶段。 大模型应用需要全生命周期管理能力,而不仅仅是API调用。 工具集的局限性 SpringAI作为工具集的定位࿱…...
JAVASCRIPT 异步函数:底层原理,fetch,promise实例方法then, catich
什么是异步 所谓“异步函数”通常指这样一种函数:它在编写时会调用异步 API 并在某个时机(可能是定时、可能是等待网络、也可能是其他操作)把结果“异步”地返回。而“回调函数”是异步函数执行完成后会去调用的函数,也就是“等待…...
docker run -p 5000:5000 my-flask-app
docker run -p 5000:5000 my-flask-app代码的意思是: 运行 my-flask-app 容器,并把 Flask 服务器的 5000 端口映射到本机的 5000 端口。 拆解解释 docker run -p 5000:5000 my-flask-app✅ docker run → 运行一个 Docker 容器 ✅ -p 5000:5000 → 端口…...
头文件“stm32f10x.h“与 “stdint.h“和“stdio.h“之间的关系
目录 一、#include "stm32f10x.h"包含#include "stdint"吗? 1、直接包含情况 2、间接依赖情况 3、实际使用建议 二、#include "stm32f10x.h"包含#include "stdio.h"吗? 1、头文件功能与设计目的差异 2、实…...