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来提供一致的读取视图,即使在事务开始后,有其他事务对记录进行了更新或删除操作。

相关推荐
雨奔几秒前
Flask 学习路线图
数据库·学习·flask
TDengine (老段)1 分钟前
从“事后抢险”到“事前防控”:江西水投用 TDengine 时序数据库重塑防汛模式
大数据·数据库·物联网·时序数据库·tdengine·涛思数据·1024程序员节
友友马1 小时前
『 QT 』QT控件属性全解析 (二)
开发语言·数据库·qt
像风一样!6 小时前
MySQL Galera Cluster部署如何实现负载均衡和高可用
数据库·mysql
last_zhiyin7 小时前
Oracle sql tuning guide 翻译 Part 6-4 --- Hint使用准则和Hint使用报告
数据库·sql·oracle·sql tunning
chenchihwen8 小时前
AI代码开发宝库系列:FAISS向量数据库
数据库·人工智能·python·faiss·1024程序员节
小光学长8 小时前
基于Vue的课程达成度分析系统t84pzgwk(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
摇滚侠9 小时前
全面掌握PostgreSQL关系型数据库,备份和恢复,笔记46和笔记47
java·数据库·笔记·postgresql·1024程序员节
周杰伦fans9 小时前
Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决
数据库·mysql·sqlserver
csdn_aspnet10 小时前
如何在 Ubuntu 24.04/22.04/20.04 上安装 MySQL 8.0
linux·mysql·ubuntu