当前位置: 首页 > article >正文

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

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.kler.cn/a/451823.html

相关文章:

  • AIA - IMSIC之二(附IMSIC处理流程图)
  • 本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin
  • C++23新特性解析:[[assume]]属性
  • 帧缓存的分配
  • Rasa框架的优点和缺点
  • 金仓数据库安装-Kingbase v9-centos
  • 洛谷 P11242 碧树 C语言
  • openGauss系列_Centos 7.6 使用 PTK v0.5 安装部署 MogDB v3.0.3 一主两备级联集群
  • YOLOv9-0.1部分代码阅读笔记-plots.py
  • P7——pytorch马铃薯病害识别
  • 使用envoyfilter添加请求头
  • windows nacos安装配置
  • 反应力场的生成物、反应路径分析方法
  • unity弹出新的类似独立场景窗口独立运行一般怎么实现?
  • 【文档搜索引擎】搜索模块的完整实现
  • docker 部署HivisionIDPhotos实现证件照制作
  • springboot/ssm太原学院商铺管理系统Java代码编写web在线购物商城
  • dolphinscheduler服务RPC负载均衡源码解析(二)基于多种不同算法的负载均衡策略实现源码解析
  • 一文掌握如何编写可重复执行的SQL
  • Day55 图论part05
  • 【uniapp】支付宝付款成功后怎么调回自定义页面
  • 51c大模型~合集96
  • vue2版本elementUI的clearable属性和DateTimePicker 下拉框的清空功能冲突
  • MFC/C++学习系列之简单记录1——错误解决与Dialog移植
  • 【hackmymv】emma靶机wp
  • 如何在Facebook发布Reels?简单易懂的操作指南