当前位置:网站首页>MySQL中InnoDB的多版本并发控制(MVCC)的实现
MySQL中InnoDB的多版本并发控制(MVCC)的实现
2022-07-31 07:34:00 【wowchx】
MySQL的大多事务型存储引擎实现的都不是简单的行级锁,基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。
MVCC的实现,是通过保存数据在某个时间点的快照来实现的。它在很多情况下避免了加锁操作,因此性能开销更低。虽然各个数据库的MVCC实现机制略有差异,但大都实现了非阻塞的读操作,今天我们来详细介绍一下InnoDB存储引擎中MVCC的实现。
InnoDB的MVCC,是通过在每行记录后面保存的两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
SELECT
InnoDB会根据以下两个条件检查每行记录
1.InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。
2.行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。
只有符合上述两个条件的记录,才能返回作为查询结果。
INSERT
InnoDB为新插入的每一行保存当前系统版本号作为行版本号。
DELETE
InnoDB为删除的每一行保存当前系统版本号作为行删除标识。
UPDATE
InnoDB为插入一行新纪录,保存当前系统版本号作为行版本号名同时保存当前系统版本号到
原来的行作为行删除标识
特别注意,MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作,其他两个隔离级别都和MVCC不兼容。
边栏推荐
- 分布式缓存系统必须要解决的四大问题
- How to set the computer password?How to add "safety lock" to your computer
- The Spark run on Yarn Spark application
- 2022.07.24_Daily Question
- Read Elephant Swap in one article, why does it bring such a high premium to ePLATO?
- navicat 新建数据库
- 使用MySQL如何查询一年中每月的记录数
- First acquaintance with NK-RTU980 development board
- Collation and sharing of related classic papers and datasets in the field of deep learning communication
- interrupt and pendSV
猜你喜欢

使用PageHelper实现分页查询(详细)

机器学习---线性回归、Logistic回归问题相关笔记及实现

regex bypass

进程调度的基本过程
![[Interview: Concurrency 37: Multithreading: Thread Pool] Custom Thread Pool](/img/61/71131414c48bb77aa9160b61a68811.png)
[Interview: Concurrency 37: Multithreading: Thread Pool] Custom Thread Pool

"C language game" entry-level chess game (robot enhanced version)

shell/bash脚本命令教程

Super detailed mysql database installation guide

Regarding "computing power", this article is worth reading

CNN--Introduction to each layer
随机推荐
【Objective-C语言中的@property】
最大似然估计和最小二乘法 含代码
Zabbix6.2 Surprise Release!Especially optimize the performance of medium and large environment deployment!
"C language" frog jumping steps recursion problem
《如何戒掉坏习惯》读书笔记
Environment_Variable_and_SetUID
2022.07.22 _ a day
Collation and sharing of related classic papers and datasets in the field of deep learning communication
Ubuntu22.04安装mysql
Super detailed mysql database installation guide
MySQL详解
波士顿房价数据集 Boston house prices dataset
NK - RTU980 burning bare-metal program
MySQL安装常见报错处理大全
How to set the computer password?How to add "safety lock" to your computer
Unreal基础概念
使用PageHelper实现分页查询(详细)
navicat 新建数据库
2022.07.26_Daily Question
MySQL 5.7 安装教程(全步骤、保姆级教程)