MySQL-MVCC(多版本并发控制)

ops/2024/12/27 10:22:10/

MySQL中的MVCC(Multi-Version Concurrency Control)是一种并发控制机制,用于提供读-写冲突时的可靠读取。

MVCC通过保存数据在某个时间点的快照来实现这一点,从而避免了传统的锁定方法。在InnoDB存储引擎中,MVCC是通过在每行记录后面保存两个隐藏的列来实现的,这两个列分别保存了这行数据的创建版本号和删除版本号。

创建版本号:事务开始时,会生成一个全局唯一的事务ID,这个ID是事务版本号,每一行数据在被插入或更新时,会将这个版本号作为创建版本号存储。

删除版本号:当行被删除时,并不会立即物理删除,而是将删除版本号存储在该行记录中。

当执行SELECT操作时,MVCC会选择以下行:

创建版本号小于或等于当前事务版本号的行,这意味着它们在事务开始之前已经存在或已创建。

删除版本号大于当前事务版本号或为空的行,这意味着它们在事务开始之前没有被删除。

这样,即使其他事务正在修改数据,也可以提供一致的读取视图。

由于MVCC复杂度较高,实际实现细节可能因存储引擎而异。对于InnoDB存储引擎,通常不需要手动管理版本号,因为这一切都是由InnoDB自动处理的。

以下是一个简单的例子,演示如何在InnoDB中使用MVCC:

-- 假设有一个简单的表users

CREATE TABLE users (

    id INT PRIMARY KEY,

    name VARCHAR(255),

    age INT

);

-- 开始一个新事务

START TRANSACTION;

-- 插入一条记录

INSERT INTO users (id, name, age) VALUES (1, 'Alice', 25);

-- 提交事务

COMMIT;

-- 另一个事务开始后读取users表

START TRANSACTION;

-- 此时,即使另一个事务更新或删除了这条记录,我们仍然能够读取到这条记录的初始版本

SELECT * FROM users WHERE id = 1;

-- 提交事务

COMMIT;

在这个例子中,使用了MVCC来提供一致的读取视图,即使在事务开始后,有其他事务对记录进行了更新或删除操作。


http://www.ppmy.cn/ops/145345.html

相关文章

基于Spring Boot的中国戏曲文化传播系统

一、系统背景与意义 中国戏曲作为中华民族的文化瑰宝,具有深厚的历史底蕴和艺术价值。然而,随着现代生活节奏的加快和娱乐方式的多样化,传统戏曲文化的传播和普及面临诸多挑战。因此,开发一个基于Spring Boot的中国戏曲文化传播系…

自定义 Celery的logging模块

为什么需要自定义 Celery 日志 默认的 Celery 日志配置虽然满足基本需求,但在以下情况下可能需要进行自定义: 支持日志滚动:原生celery不支持日志滚动。更详细的日志信息:需要包含更多上下文信息,以便更好地理解任务…

基于 Python 考研历年国家分数线大数据分析设计与实现

标题:基于 Python 考研历年国家分数线大数据分析设计与实现 内容:1.摘要 摘要:本文介绍了基于 Python 的考研历年国家分数线大数据分析设计与实现。文章首先介绍了研究背景和目的,即通过对考研历年国家分数线的大数据分析,为考生提供参考和指…

音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息

一、引言 通过FFprobe命令: ffprobe -of json -show_packets XXX.ts 可以显示TS流/TS文件每个packet(也称为数据包或多媒体包)的信息: 对于TS流,上述的“packet”(数据包或多媒体包)是指&…

讯飞语音听写WebApi(流式)【React Native版】

假设已有 Base64 编码的音频文件(16kHz, s16le, pcm) 1、获取websocket url import * as CryptoJS from crypto-js;/*** 获取websocket url*/ const getWebSocketUrl () > {const config {// 请求地址hostUrl: "wss://iat-api.xfyun.cn/v2/iat",host: "i…

【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo

【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo 前言摘要引言Task 相关工作方法SDM-UniPS预处理尺度不变的空间光特征编码器像素采样变压器的非局部交互 PS-Mix数据集 实验结果训练细节评估和时间: 消融实验定向照明下的评估没有对…

【UE5 C++课程系列笔记】14——GameInstanceSubsystem与动态多播的简单结合使用

效果 通过在关卡蓝图中触发GameInstanceSubsystem包含的委托,来触发所有绑定到这个委托的事件,从而实现跨蓝图通信。 步骤 1. 新建一个C类 这里命名为“SubsystemAndDelegate” 引入GameInstanceSubsystem.h,让“SubsystemAndDelegate”继承…

vue 嵌套el-dialo,当内层的弹窗弹出时,整个页面被遮罩

活不多说,直接上问题 当在页面上,点击出现第一个弹窗,然后在弹窗里面,点击在再出现一个弹窗时,就是如下效果。 查看Html,出现了遮罩层 Vue的建议是,不建议嵌套 Dialog,但实际上肯定存在嵌套 …