mysql mvvc 实现方案

news2025/4/25 4:31:09

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: 102

1、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中,是未来版本,因此不可见

快照读:

当前读:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

校园外卖服务系统的设计与实现(代码+数据库+LW)

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;外卖信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

纷析云:开源财务管理软件的创新与价值

在企业数字化转型中&#xff0c;纷析云作为一款优秀的开源财务管理软件&#xff0c;正为企业财务管理带来新变革&#xff0c;以下是其核心要点。 一、产品概述与技术架构 纷析云采用微服务架构&#xff0c;功能组件高内聚低耦合&#xff0c;可灵活扩展和定制。前端基于现代框…

Centos安装Dockers+Postgresql13+Postgis3.1

centos8安装docker步骤 1、# 强制卸载 podman 和 buildah 执行命令&#xff1a; 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有什么区别&#xff1f; 端口号&#xff1a;HTTP默认是80端口&#xff0c;HTTPS默认是443。 URL前缀&#xff1a;HTTPHTTP 的 URL 前缀是 http://&#xff0c;HTTPS 的 URL 前缀是 https://。 安全性和资源消耗&#xff1a;HTTP协议运行在TCP上&#xff0c;都是明…

单片机——使用printf调试

配置printf()输出函数 1、来自于<stdio.h> 2、运行C语言时&#xff0c;输出到终端 3、单片机没有终端&#xff0c;需要使用串口&#xff0c;将要输出的内容传到电脑&#xff08;串口调试助手&#xff09;上 例子如下 #include <stdio.h> #include &qu…

4.23晚间工作总结

主要工作&#xff1a;将ClassicDetail界面拆分成utils,apis,stores,css,vue多个文件&#xff0c;方便后续重用 具体代码截图&#xff1a;

JavaEE学习笔记(第二课)

1、好用的AI代码工具cursor 2、Java框架&#xff1a;Spring(高级框架)、Servelt、Struts、EJB 3、Spring有两层含义&#xff1a; ①Spring Framework&#xff08;原始框架&#xff09; ②Spring家族 4、Spring Boot(为了使Spring简化) 5、创建Spring Boot 项目 ① ② ③…

约束constraint

创建表时&#xff0c;可以给表的字段添加约束&#xff0c;可以保证数据的完整性、有效性。比如大家上网注册用户时常见的&#xff1a;用户名不能为空。对不起&#xff0c;用户名已存在。等提示信息。 约束通常包括&#xff1a; 非空约束&#xff1a;not null检查约束&#xf…

解锁现代生活健康密码,开启养生新方式

在科技飞速发展的当下&#xff0c;我们享受着便捷生活&#xff0c;却也面临诸多健康隐患。想要维持良好状态&#xff0c;不妨从这些细节入手&#xff0c;解锁科学养生之道。​ 肠道是人体重要的消化器官&#xff0c;也是最大的免疫器官&#xff0c;养护肠道至关重要。日常可多…

在kali中安装AntSword(蚁剑)

步骤一、下载压缩包 源码&#xff1a;https://github.com/AntSwordProject/antSword&#xff0c;下载压缩包。 加载器&#xff1a;https://github.com/AntSwordProject/AntSword-Loader&#xff0c;根据系统选择压缩包&#xff08;kali选择AntSword-Loader-v4.0.3-linux-x64&…

GateWay与Consul知识点

这是一个涵盖客户端访问、网关处理、服务注册发现、业务服务及鉴权授权的系统架构图&#xff0c;各部分解析如下&#xff1a; 客户端层 App 端、Web 端&#xff1a;代表不同类型的客户端&#xff0c;涵盖手机 App、电脑 Web 页面等。用户通过这些客户端发起请求&#xff0c;访…

安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?

一、AugmentOS&#xff1a;AI可穿戴的“操作系统革命” 2025年2月3日&#xff0c;Vuzix与AI人机交互团队Mentra联合推出的AugmentOS&#xff0c;被业内视为智能眼镜领域的“iOS时刻”。这款全球首个专为智能眼镜设计的通用操作系统&#xff0c;通过三大突破重新定义了AI可穿戴…

LeetCode每日一题4.20

781.森林中的兔子 问题 问题分析 根据题目描述&#xff0c;我们需要解决的问题是&#xff1a;给定一个数组 answers&#xff0c;其中每个元素表示某只兔子回答的“还有多少只兔子与你颜色相同”&#xff0c;要求返回森林中兔子的最少数目。 思路 理解 answers 数组&#xf…

Leetcode - 周赛446

目录 一、3522. 执行指令后的得分二、3523. 非递减数组的最大长度三、3524. 求出数组的 X 值 I四、3525. 求出数组的 X 值 II 一、3522. 执行指令后的得分 题目链接 本题就是一道模拟题&#xff0c;代码如下&#xff1a; class Solution {public long calculateScore(String…

时序数据库 TDengine 助力石油石化业务, 平滑接替 Oracle 数据库

小T导读&#xff1a;胜软科技在石油石化行业中选择使用 TDengine 处理时序数据&#xff0c;不仅显著降低了运维数据库的成本&#xff0c;也大幅减少了存储空间的占用&#xff0c;实现了从原有的 40 多套 Oracle 数据库向仅 9 套 TDengine集群的精简替换。在迁移过程中&#xff…

macOS 系统设置息屏情况下,PHP等后台脚本继续执行

在 macOS 系统下&#xff0c;当屏幕息屏或合上盖子时&#xff0c;后台脚本程序是否会继续运行&#xff0c;主要取决于以下几个因素&#xff1a; 1. 系统睡眠状态的影响 默认情况&#xff1a;合盖/息屏后&#xff0c;Mac 会进入「睡眠模式」&#xff08;部分硬件休眠&#xff…

Prompt-Tuning 提示词微调

1. Hard Prompt 定义&#xff1a; Hard prompt 是一种更为具体和明确的提示&#xff0c;要求模型按照给定的信息生成精确的结果&#xff0c;通常用于需要模型提供准确答案的任务. 原理&#xff1a; Prompt Tuning原理如下图所示&#xff1a;冻结主模型全部参数&#xff0c;在…

asp.net core webapi+efcore

简洁的restfull风格 目前c#提供了多种风格的web编程&#xff0c;因为微软有自己的前端&#xff0c;所以集成了很多内容&#xff0c;不过基于现在编程前后端分离的模式&#xff0c;webapi是合适的。 webapi 目前网络上有很多介绍&#xff0c;不反复说这个了。在建立控制器时&…

前端渲染pdf文件解决方案-pdf.js

目录 一、前言 二、简介 1、pdf.js介绍 2、插件版本参数 三、通过viewer.html实现预览&#xff08;推荐&#xff09; 1、介绍 2、部署 【1】下载插件包 【2】客户端方式 【3】服务端方式&#xff08;待验证&#xff09; 3、使用方法 【1】预览PDF文件 【2】外部搜索…

从边缘到云端,如何通过时序数据库 TDengine 实现数据的全局洞

在当今数字化转型加速的背景下&#xff0c;海量的数据生成和实时处理需求已成为企业面临的关键挑战。无论是物联网设备、工业自动化系统&#xff0c;还是智能城市的各类传感器&#xff0c;数据的采集、传输与分析效率&#xff0c;直接影响企业的决策与运营。为此&#xff0c;TD…