mysql mvvc 实现方案
Mysql 事务隔离级别
并发问题
mysql中事务并发时,会产生的问题如下
脏读:
读到了其他事务中,暂未提交的数据
脏读 (Dirty Read) 是数据库事务隔离级别中最低的一种隔离级别 (READ UNCOMMITTED) 下可能出现的一种并发问题。 它指的是一个事务读取了另一个事务尚未提交 (未持久化) 的数据。 如果后续未提交的事务回滚了,那么第一个事务读取到的数据就是无效的、不正确的,相当于读取了“脏”数据。
幻读:
同一个事务中,相同的查询,前后记录条数不一致
幻读 (Phantom Read) 是数据库事务隔离级别下可能出现的一种并发问题。 它指的是在一个事务内,第一次读取符合某些条件的数据,第二次读取同一范围的数据时,却发现了第一次查询中不存在的新数据 (幻影行),好像凭空出现了一样。 这是因为在两次读取之间,另一个事务插入了满足查询条件的新数据并提交了
常见问题:
事务1:读取A表,判断id=1是否存在,发现不存在,(此时事务2:写入A表,id=1),事务1:写入A表id=1报错主键冲突
不可重复读:
同一个事务中,相同的查询,相同记录,前后结果不一致
不可重复读 (Non-repeatable Read) 是数据库事务隔离级别下可能出现的一种并发问题。 它指的是在一个事务内,两次读取同一行数据,得到的结果不一致。 这是因为在两次读取之间,另一个事务修改了该数据并提交了
隔离级别
RU:
RU(READ UNCOMMITTED) 不管任何并发性问题,上述问题一个没解决
RC:
RC (READ COMMITTED) 读已提交,只解决了脏读
RR:
RR (REPEATABLE READ) 可重复读,它保证在同一个事务中,多次读取同一数据时,数据值是一致的,但可能存在“幻读”问题。
SERIALIZABLE
SERIALIZABLE 顺序读,最严格事务机制,事务串行执行,上述问题都可以解决,常见于金融系统
实现方案:MVCC
多版本并发控制 (Multi-Version Concurrency Control, MVCC) ,上述隔离级别的实现方案
UNDO LOG:
每个mysql表都有两个隐藏"字段",trx_id(修改该数据的事务的事务编号),roll_pointer(修改该数据之前数据视图指针),这两个关键字段是在事务执行过程中修改数据时立即更新的,而不是在事务提交后
INSERT 操作: 当一个事务插入一条新记录时,InnoDB 会立即将该记录的 row.trx_id 设置为当前事务的 trx_id。 这意味着从那一刻起,InnoDB 就知道这条记录是由哪个事务创建的。
UPDATE 操作: 当一个事务更新一条现有记录时,InnoDB 不会直接修改原始记录。 而是创建一个新的数据版本,并将 row.trx_id 设置为当前事务的 trx_id。 原始记录会被保留,并标记其 row_del_trx_id (如果需要,取决于更新的性质)。 这就是 MVCC 的核心思想:保留多个版本的数据,以便不同的事务可以看到不同时间点的数据状态。
DELETE 操作: 虽然是删除操作,但 InnoDB 实际上只是将该记录的 row_del_trx_id 设置为当前事务的 trx_id, 标记为已删除。 数据的物理删除可能会在以后的某个时间进行 (例如,通过 purge 线程)。

READ VIEW:
read view 数据版本管理重要参数封装,有四个关键参数
m_ids : 生成Read View时,同时运行的事务编号List (不包括当前事务自身)
min_limit_id :表示在生成 Read View 时,当前系统中活跃的读写事务中最小的事务 id,即 m_ids 中的最小值。
max_limit_id :表示生成 Read View 时,系统中应该分配给下一个事务的 id 值,即max(m_ids)+1。
creator_trx_id : 创建当前 Read View 的事务 ID (也就是当前事务的 ID)
如上图
m_ids:[100,103,104]
min_limit_id: 100
max_limit_id: 105
creator_trx_id: 102
这里会有个疑问,102事务启动时,103、104肯定还没启动或同时启动,此时102创建的m_ids中怎么可能包含103、104?
答:102启动立刻分配trx_id=102,但是从102启动到生成read_view 是有一段时间间隔的
T0: 事务 102 开始,trx_id 102被分配。
T1: 事务 102 正在创建 Read View。
T2: 事务 103 开始,trx_id 103 被分配。
T3: 事务 104 开始,trx_id 104 被分配。
T5: 事务 102 完成 Read View 的创建。
RR实现方式
沿用上图readview
102事务进行查询时,row.trx_id 可能出现如下情况
- 如果数据事务 ID trx_id < min_limit_id ,表明生成该版本的事务在生成 ReadView前,已经提交(因为事务 ID 的递增的),所以该版本可以被当前事务访问。
- 如果 trx_id>= max_limit_id ,表明生成该版本的事务在生成 Read View 后才生成,所以该版本不可以被当前事务访问。
- 如果 min_limit_id =<trx_id< max_limit_id ,需要分 3 种情况讨论
-
如果 m_ids 包含 trx_id ,则代表 Read View 生成时刻,这个事务还未提交,但是如果数据的 trx_id 等于 creator_trx_id 的话,表明数据是自己生成的,因此是可见的。
-
如果 m_ids 包含 trx_id ,并且 trx_id 不等于 creator_trx_id ,则ReadView 生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
-
如果 m_ids 不包含 trx_id ,则说明你这个事务在 Read View 生成之前就已经提交了,修改的结果,当前事务是能看见的
-
如果某一版本不可见,就会根据undo_log版本链向后查询(101不行看100,100不行看99),直到找到可见版本,然后返回
举例说明:
read_view
m_ids:[101,102,103,104]
min_limit_id: 100
max_limit_id: 105
creator_trx_id: 1021、eg: row.trx_id <= 99
102查询时,事务<=99版本不处于m_ids中,是历史版本,因此可见2、eg: row.trx_id = 100
102查询时,事务100版本处于m_ids中是当前版本,不是自己的,因此不可见3、eg: row.trx_id = 101
102查询时,事务101版本不处于m_ids中,是历史版本,因此可见3、eg: row.trx_id = 102
102查询时,事务102版本是自己的,因此可见4、eg: row.trx_id = 103
102查询时,事务103版本处于m_ids中,是当前版本,不是自己的,因此不可见5、eg: row.trx_id = 104
102查询时,事务104版本处于m_ids中,是当前版本,不是自己的,因此不可见6、eg: row.trx_id >= 105
102查询时,事务>=105版本不处于m_ids中,是未来版本,因此不可见
快照读:
当前读:
相关文章:
mysql mvvc 实现方案
Mysql 事务隔离级别 并发问题 mysql中事务并发时,会产生的问题如下 脏读: 读到了其他事务中,暂未提交的数据 脏读 (Dirty Read) 是数据库事务隔离级别中最低的一种隔离级别 (READ UNCOMMITTED) 下可能出现的一种并发问题。 它指的是一个事务读取了另…...
校园外卖服务系统的设计与实现(代码+数据库+LW)
摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,外卖信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…...
纷析云:开源财务管理软件的创新与价值
在企业数字化转型中,纷析云作为一款优秀的开源财务管理软件,正为企业财务管理带来新变革,以下是其核心要点。 一、产品概述与技术架构 纷析云采用微服务架构,功能组件高内聚低耦合,可灵活扩展和定制。前端基于现代框…...
Centos安装Dockers+Postgresql13+Postgis3.1
centos8安装docker步骤 1、# 强制卸载 podman 和 buildah 执行命令: yum erase podman buildah 2、# 添加阿里云仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3、# 安装基础依赖包 yum install…...
【计算机网络 | 第二篇】常见的通信协议(一)
HTTP和HTTPS有什么区别? 端口号:HTTP默认是80端口,HTTPS默认是443。 URL前缀:HTTPHTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://。 安全性和资源消耗:HTTP协议运行在TCP上,都是明…...
基于Java与MAVLink协议的多无人机(Cube飞控)集群控制与调度方案问题
基于Java与MAVLink协议的多无人机(Cube飞控)集群控制与调度方案问题 背景需求: 我们目前有一个基于Cube飞控的无人机系统,需实现以下核心功能: 多机通信:通过MAVLink协议同时连接并控制多架无人机&#x…...
单片机——使用printf调试
配置printf()输出函数 1、来自于<stdio.h> 2、运行C语言时,输出到终端 3、单片机没有终端,需要使用串口,将要输出的内容传到电脑(串口调试助手)上 例子如下 #include <stdio.h> #include &qu…...
4.23晚间工作总结
主要工作:将ClassicDetail界面拆分成utils,apis,stores,css,vue多个文件,方便后续重用 具体代码截图:...
Spring 用到了哪些设计模式?
Spring 框架使用了多种设计模式,这些模式帮助其实现松耦合、高内聚和可扩展性。以下是 Spring 中常见的设计模式及其应用场景: 1. 工厂模式(Factory Pattern) 应用场景:Spring 的 BeanFactory 和 ApplicationContext 是…...
JavaEE学习笔记(第二课)
1、好用的AI代码工具cursor 2、Java框架:Spring(高级框架)、Servelt、Struts、EJB 3、Spring有两层含义: ①Spring Framework(原始框架) ②Spring家族 4、Spring Boot(为了使Spring简化) 5、创建Spring Boot 项目 ① ② ③…...
约束constraint
创建表时,可以给表的字段添加约束,可以保证数据的完整性、有效性。比如大家上网注册用户时常见的:用户名不能为空。对不起,用户名已存在。等提示信息。 约束通常包括: 非空约束:not null检查约束…...
【Qwen2.5-VL 踩坑记录】本地 + 海外账号和国内账号的 API 调用区别(阿里云百炼平台)
API 调用 阿里云百炼平台的海内外 API 的区别: 海外版:需要进行 API 基础 URL 设置国内版:无需设置。 本人的服务器在香港,采用海外版的 API 时,需要进行如下API端点配置 / API基础URL设置 / API客户端配置…...
解锁现代生活健康密码,开启养生新方式
在科技飞速发展的当下,我们享受着便捷生活,却也面临诸多健康隐患。想要维持良好状态,不妨从这些细节入手,解锁科学养生之道。 肠道是人体重要的消化器官,也是最大的免疫器官,养护肠道至关重要。日常可多…...
在kali中安装AntSword(蚁剑)
步骤一、下载压缩包 源码:https://github.com/AntSwordProject/antSword,下载压缩包。 加载器:https://github.com/AntSwordProject/AntSword-Loader,根据系统选择压缩包(kali选择AntSword-Loader-v4.0.3-linux-x64&…...
GateWay与Consul知识点
这是一个涵盖客户端访问、网关处理、服务注册发现、业务服务及鉴权授权的系统架构图,各部分解析如下: 客户端层 App 端、Web 端:代表不同类型的客户端,涵盖手机 App、电脑 Web 页面等。用户通过这些客户端发起请求,访…...
安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?
一、AugmentOS:AI可穿戴的“操作系统革命” 2025年2月3日,Vuzix与AI人机交互团队Mentra联合推出的AugmentOS,被业内视为智能眼镜领域的“iOS时刻”。这款全球首个专为智能眼镜设计的通用操作系统,通过三大突破重新定义了AI可穿戴…...
【数据结构和算法】1. 数据结构和算法简介、二分搜索
本文根据 数据结构和算法入门 视频记录 文章目录 1. 数据结构和算法简介1.1 什么是数据结构?什么是算法?1.2 数据结构和算法之间的关系1.3 “数据结构和算法”有那么重要吗? 2. 二分搜索(Binary Search)2.1 算法概念2…...
SpringBoot3设置maven package直接打包成二进制可执行文件
注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package(注意:使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…...
LeetCode每日一题4.20
781.森林中的兔子 问题 问题分析 根据题目描述,我们需要解决的问题是:给定一个数组 answers,其中每个元素表示某只兔子回答的“还有多少只兔子与你颜色相同”,要求返回森林中兔子的最少数目。 思路 理解 answers 数组…...
Leetcode - 周赛446
目录 一、3522. 执行指令后的得分二、3523. 非递减数组的最大长度三、3524. 求出数组的 X 值 I四、3525. 求出数组的 X 值 II 一、3522. 执行指令后的得分 题目链接 本题就是一道模拟题,代码如下: class Solution {public long calculateScore(String…...
时序数据库 TDengine 助力石油石化业务, 平滑接替 Oracle 数据库
小T导读:胜软科技在石油石化行业中选择使用 TDengine 处理时序数据,不仅显著降低了运维数据库的成本,也大幅减少了存储空间的占用,实现了从原有的 40 多套 Oracle 数据库向仅 9 套 TDengine集群的精简替换。在迁移过程中ÿ…...
macOS 系统设置息屏情况下,PHP等后台脚本继续执行
在 macOS 系统下,当屏幕息屏或合上盖子时,后台脚本程序是否会继续运行,主要取决于以下几个因素: 1. 系统睡眠状态的影响 默认情况:合盖/息屏后,Mac 会进入「睡眠模式」(部分硬件休眠ÿ…...
vue3 el-table 右击
在 Vue 3 中使用 Element Plus 的 <el-table> 组件时,如果你想实现右击(右键点击)事件的处理,你可以通过监听 contextmenu 事件来实现。contextmenu 事件在用户尝试打开上下文菜单(通常是右键点击)时…...
Prompt-Tuning 提示词微调
1. Hard Prompt 定义: Hard prompt 是一种更为具体和明确的提示,要求模型按照给定的信息生成精确的结果,通常用于需要模型提供准确答案的任务. 原理: Prompt Tuning原理如下图所示:冻结主模型全部参数,在…...
asp.net core webapi+efcore
简洁的restfull风格 目前c#提供了多种风格的web编程,因为微软有自己的前端,所以集成了很多内容,不过基于现在编程前后端分离的模式,webapi是合适的。 webapi 目前网络上有很多介绍,不反复说这个了。在建立控制器时&…...
前端渲染pdf文件解决方案-pdf.js
目录 一、前言 二、简介 1、pdf.js介绍 2、插件版本参数 三、通过viewer.html实现预览(推荐) 1、介绍 2、部署 【1】下载插件包 【2】客户端方式 【3】服务端方式(待验证) 3、使用方法 【1】预览PDF文件 【2】外部搜索…...
vue3 + element-plus中el-drawer抽屉滚动条回到顶部
el-drawer抽屉滚动条回到顶部 <script setup lang"ts" name"PerformanceLogQuery"> import { ref, nextTick } from "vue"; ...... // 详情 import { performanceLogQueryByIdService } from "/api/performanceLog"; const onD…...
从边缘到云端,如何通过时序数据库 TDengine 实现数据的全局洞
在当今数字化转型加速的背景下,海量的数据生成和实时处理需求已成为企业面临的关键挑战。无论是物联网设备、工业自动化系统,还是智能城市的各类传感器,数据的采集、传输与分析效率,直接影响企业的决策与运营。为此,TD…...
2025.04.23【Treemap】树状图数据可视化指南
Multi-level treemap How to build a treemap with group and subgroups. Customization Customize treemap labels, borders, color palette and more 文章目录 Multi-level treemapCustomization Treemap 数据可视化指南Treemap 的基本概念为什么使用 TreemapTreemap 的应用…...
蓝桥杯 15.小数第n位
小数第n位 原题目链接 题目描述 我们知道,整数做除法时,有时会得到有限小数,有时会得到无限循环小数。 如果我们把有限小数的末尾加上无限多个 0,它们就具有了统一的形式。 本题的任务是:在上述约定下,…...
