mysql mvvc 实现方案

MySql之MVVC总结 本文主要讲述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: 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中,是未来版本,因此不可见

快照读:

当前读:

RuoYi项目适配达梦数据库(二) RuoYi项目,代码生成模块的达梦数据库适配。 阅读详情

相关推荐

Windows系统离线搭建PyTorch深度学习环境全攻略(CUDA+cudnn实战)

本文提供了一份在Windows系统下离线搭建PyTorch深度学习环境的完整实战指南。文章详细讲解了如何在没有网络连接的情况下,正确安装和配置CUDA、cudnn以及PyTorch,并构建独立的Python虚拟环境。重点强调了版本依赖关系的重要性,并提供了从驱动准备到环境验证的每一步操作,旨在帮助用户高效、稳定地部署可复用的GPU深度学习开发环境。

table的专栏 579

MySQL-14:count()函数

13.1 count(*)函数的实现 count(*)在MySQL不同的引擎中存在不同的实现方式: MyISAM引擎:把表的总行数存在磁盘上,能直接返回count(*)的结果 InnoDB引擎:需要对数据进行一行一行地累加计数 前提都是没有where子句,如果MyISAM也不能这么快返回结果。 InnoDB为什么不学学MyISAM: InnoDB由于MVVC特性的存在,一个事务不知道这个数据的当前版本是否对它来说是可见的,需要一个一个去核对。 MySQL对count(*)的优化: 在保证逻辑正确的情况下

记录,记录,记录 229

arcgis建筑数据的矢量化(一)

简单来说,建筑数据的获取无外乎是矢量化和去网站下载 无奈的是,osm和网上的建筑数据只有全国的主要城市,实在是为难我们这些小城市的,百度和天地图上是有建筑数据,无奈人家不要开放下载啊,所以就只能矢量化咯, 矢量化,无外乎手动和自动,手动就是新建shp面手动勾绘,这里就不讲了,我们来看看自动矢量化 自动矢量化在arcgis中主要是利用arcscan和栅格转面(栅格转面这个效果真是一言难尽,所以我们主要讨论arcscan) 同时我们矢量化也不一定要局限于arcgis...

Jasenjane的博客 3927

MySQL是如何实现事务的——锁机制、MVVC详解

🌟 前言 🐶 作者简介:大家好,我是周周,目前就职于国内短视频小厂BUG攻城狮一枚。 💻个人主页:程序猿周周 📖专题系列:Java面试总结 🤺 如果文章对你有帮助,记得👍点赞👍、👀关注👀➕👌收藏👌,一键三连哦,你的支持将成为我最大的动力。 文章目录🌟 前言1 事务1.1 事务基本特性1.2 事务并发问题1.3 事务隔离级别2 锁机制2.1 锁分类2.1.1 粒度划分2.1.2 用法划分2.2 锁实现2.2.1 记录锁2.2.2 间隙锁2.2.3 临键锁2.3 意向锁2.3.1 意向锁作用2.3.2 意向

程序猿周周的博客 3498

Bentley二次开发教程28-交互窗口-案例实战2-EC属性赋值工具

该工具会根据用户输入的路径获取Schema文件的路径,然后通过路径读取对应的Schema文件并在树状图中显示EC类,当用户选择树状图上的节点时,此时会触发事件,根据EC属性添加用户自定义控件用于显示EC属性并可对其进行赋值操作。完成后选取元素,点击界面上的应用,此时元素会被赋予指定EC类,同时修改的EC属性值也会被同步赋予。该工具涉及到的WinForm控件有:TextBox,Button,TreeView,Panel,UserControl(用户自定义控件)。

不见不散的博客 1475

内存优化--LOGBACK导致内存告警

一.故事背景 由于开辟新市场需要,开发了新的项部署在海外平台,其中最消耗内存的功能是消费kafka消息(最开始预计一天有1千万的量),部署完之后运行一段时间发现出现内存告警问题。 二.分析问题 出现内存告警,(新项目是低配置机器 2C4G * 2台)第一个念头是去查看堆空间设置的情况,看到jvm启动命令中堆空间都是直接指定大小,说明问题不是出在堆空间 -Xmx3g -Xms3g 先不管这些,去查看总的内存使用情况,发现总的内存空间使用将近有92% = 3.68G,那么这多出来使用的0.6

qq_33199919的博客 6052

MySQL之MVVC简介

一丶什么是MVVC?   MVVC(Multi-Version Concurrency Control)(注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,...

一只苟延残喘的卑微蝼蚁 2176

【PyTorch项目实战】图像分类与识别:手写数字识别(MNIST)、普适物体识别(CIFAR-10)

主要介绍了两个经典的实战项目:(1)基于 MNIST 数据集的手写数字识别(2)基于 CIFAR-10 数据集进行图像分类

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 4401

MySQL MVVC

什么是MVVC? MVVC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁...

weixin_34334744的博客 478

Visual Studio 2022+Qt6.5.3安装教程+环境配置+创建Qt项目+乱码插件+运行很完美(16岁孩子也能看懂)

Visual Studio 2022+Qt6.5.3安装教程+环境配置+创建Qt项目+乱码插件+运行很完美(16岁孩子也能看懂)

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 1190

基于CNN的三相故障识别算法及实现(Matlab)

通过预处理数据、构建CNN模型、训练与评估模型等步骤,我们可以准确快速地识别三相故障。现代电力系统中,三相故障是一种常见的故障情况,可以导致电网中断、设备损坏甚至火灾等严重后果。本文将介绍基于卷积神经网络(CNN)的三相故障识别算法,并提供Matlab源代码实现。首先,将原始信号分为训练集和测试集。然后,对输入信号进行归一化处理,确保数据在合适的范围内。CNN适用于处理二维数据,所以我们可以将输入信号看作是时间序列数据和特征(如电压、电流等)的二维矩阵。在开始之前,我们需要一个包含正常和故障样本的数据集。

学习使你进步。 384

Mysql MVVC笔记

什么是MVVC,为什么要用它 在mysql的InnoDB不同事务隔离级别中,MVVC(Multi-Version Concurrency Control)工作在RC(Read Commited)和RR(Repeatable Read)这两种隔离级别中。其实MVVC简单理解,就是通过对每个事务赋予一个唯一的、递增的id来代替对数据行上锁从而减小DBMS的开销**(读不会加锁)**。 举个不是很准确的例子,有两个事务T1,T2,它们的id分别是1,2。由于事务id是递增唯一的,因此可以认为T2在逻辑上是后于T1

qq_34025034的博客 2427

【漏洞复现】爱数云盘 Usrm_GetAllUsers 未授权访问漏洞

爱数 AnyShare存在未授权漏洞,未授权的攻击者可以通过该漏洞获取用户名信息。

qq_67810151的博客 3121

mysql undo mvvc_Mysql MVVC笔记

什么是MVVC,为什么要用它在mysql的InnoDB不同事务隔离级别中,MVVC(Multi-Version Concurrency Control)工作在RC(Read Commited)和RR(Repeatable Read)这两种隔离级别中。其实MVVC简单理解,就是通过对每个事务赋予一个唯一的、递增的id来代替对数据行上锁从而减小DBMS的开销,也就是读不会加锁。举个不是很准确的例子,有...

weixin_28797725的博客 74

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

谈谈对MVVC理解

综上所述,物理删除(从数据页中真正移除)会在清理阶段(purge)由后台线程异步进行,是为了确保在事务提交后其他事务仍能看到其之前版本的行,这是MySQL InnoDB存储引擎通过MVCC机制支持并发访问和事务隔离的重要体现。MySQL的MVVC机制通过维护数据的历史版本、构建事务视图以及利用可见性判断规则,实现了在高并发场景下对数据的并发访问和事务隔离,减少了锁的竞争,提升了系统性能,特别是在读多写少的环境中效果尤为明显。每当事务对数据行进行修改时,都会创建一个新的版本,并将其加入到版本链中。

qq_42025000的博客 2062

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

mysql undo mvvc_MySQL之MVVC原理

什么是MVVCMVVC(Multi-Version Concurrency Control)(注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在...

weixin_33946659的博客 256

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

mysql undo mvvc_MySQL MVVC

什么是MVVCMVVC(Multi-Version Concurrency Control)(注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在...

weixin_39790877的博客 215

mysql取消mvvc机制_MySQL之MVVC简介

MySQL之MVVC简介一丶什么是MVVC?MVVC(Multi-Version Concurrency Control)(注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一...

weixin_33585909的博客 186

mysql取消mvvc机制_MySQL MVVC

什么是MVVC?MVVC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只...

weixin_34098209的博客 155

MySQL之MVVC简单介绍

1、什么是锁? 一种保护机制,在多线程的情况下,保证操作数据的正确性与一致性 2、锁有哪些分类? 悲观锁、乐观锁、独占锁、共享锁、公平锁、非公平锁、分布式锁、自旋锁 3、谈谈悲观锁乐观锁: 指的是看待并发同步的角度,一般结合数据库将,以MySQL为例,悲观锁主要是表锁,行锁和间隙锁,叶锁,读锁,因为这些锁在被触发时会引起线程阻塞,所以叫悲观锁;而乐观锁其实在MySQL中本身不存在,但是MySQL提供了MVCC的机制,支持乐观锁机制 4、什么是MVCC? 只有在InnoDB引擎下存在,MVCC是.

jenie的专栏 6443
上一篇: hive 自动检测、自动重启、记录检测日志、自动清理日志
下一篇: linux磁盘挂载
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值