MySQL 中的 MVCC 是什么?
MySQL 中的 MVCC 是什么?
MVCC(Multi-Version Concurrency Control) 是 MySQL 数据库用来处理并发访问的技术,特别是在 InnoDB 存储引擎中,MVCC 允许多个事务并发执行而不互相干扰,确保数据的一致性和隔离性。MVCC 通过为每个数据行维护多个版本来实现这一点,每个版本对应一个特定时间点的数据状态,从而允许读操作不被写操作阻塞,同时避免数据的冲突。
MVCC 的工作原理
MVCC 依赖于数据库中的 撤销日志(Undo Log) 和 版本号 来实现。具体而言,MVCC 为每个数据行维护多个版本,每个版本都有一个特定的时间戳或事务 ID,表示它是由哪个事务创建的。以下是 MVCC 实现的基本原理:
1. 事务标识和版本控制
- 每个事务在执行时都会分配一个唯一的事务 ID(或时间戳),该事务 ID 用来标识该事务的生命周期。
- 数据行的版本会包含创建该版本的事务 ID,以及该版本被删除时的事务 ID(如果适用)。这使得每个版本都可以与其他版本区分开。
2. 数据行版本管理
在 InnoDB 中,每个数据行都有两个隐藏的列:
DB_TRX_ID和DB_ROLL_PTR:DB_TRX_ID:记录创建该行数据的事务 ID。DB_ROLL_PTR:指向撤销日志的指针,帮助恢复数据行的历史版本。
当一个事务修改数据时,InnoDB 并不会直接覆盖原有的数据行,而是创建一个新的版本。原有的数据行会通过撤销日志保留下来。
3. 读取数据的版本选择
- 当一个事务进行读取操作时,MySQL 会选择该事务可见的最新版本。也就是说,只有在事务 ID 小于等于当前事务 ID 的数据版本才对当前事务可见。
- 具体来说,如果一个事务在执行时遇到其他事务已经修改的数据,它会根据 版本号 或 时间戳 来选择一个可见的版本:
- 如果当前事务的 ID 小于数据行的
DB_TRX_ID,则当前事务不可见该数据行。 - 如果当前事务的 ID 大于数据行的
DB_TRX_ID,则该数据行对当前事务可见。 - 如果当前事务的 ID 大于删除该数据行的事务 ID(如果该行被删除),则该数据行对当前事务可见。
- 如果当前事务的 ID 小于数据行的
4. 提交和回滚
- 当一个事务提交时,所有它修改的数据版本变为对其他事务可见。
- 如果事务回滚,它所做的修改会被撤销,撤销操作通过回滚日志来实现,确保所有更改都不会影响数据库的最终状态。
MVCC 的优势
1. 提高并发性
- MVCC 允许多个事务同时读取和修改不同版本的数据行,显著提高了并发性能,尤其是在只读操作较多的场景中。读操作不会被写操作阻塞,写操作也不会影响未修改的数据行的读取。
2. 避免锁竞争
- 通过使用版本控制,MVCC 能够避免行级锁的竞争,减少了传统锁机制下的阻塞和性能瓶颈。在高并发环境下,尤其是在长事务中,MVCC 可以显著提高效率。
3. 实现一致性读
- 在 InnoDB 存储引擎中,MVCC 使得 一致性读 成为可能。即使有其他事务在修改数据,当一个事务读取数据时,它总是看到事务开始时的数据快照,而不是被其他事务修改的数据,这确保了数据的一致性。
MVCC 的挑战和限制
1. 内存和磁盘空间消耗
- 每次数据行修改时,都会创建一个新的版本。这可能导致存储空间的增加,尤其是当大量数据被修改时,多个版本会占用更多的内存和磁盘空间。
- 定期清理旧版本是必要的,这通常通过 垃圾回收(Garbage Collection) 来完成,InnoDB 会删除已经不再需要的版本。
2. 更新操作的开销
- 每次更新时,InnoDB 都需要创建新版本的数据行,并更新撤销日志。这可能会增加 I/O 操作的开销,特别是在数据更新频繁的情况下。
3. 脏读和幻读的可能性
- 在较低隔离级别(如 读未提交 或 读已提交)下,可能会出现 脏读(读取未提交的数据)或 幻读(在一个事务内重复读取数据时,结果集的内容发生变化)现象。为了避免这些问题,需要选择合适的事务隔离级别(如 可重复读 或 串行化)。
总结
MySQL 的 MVCC 通过版本控制和撤销日志来实现并发控制,允许多个事务同时执行而不互相干扰,提高了数据库的并发性能和隔离性。MVCC 是 InnoDB 存储引擎的核心特性之一,广泛应用于高并发场景中。然而,尽管 MVCC 提供了显著的性能优势,它也带来了一定的存储和内存消耗,并且需要合理配置以避免脏读和幻读等问题。
MySQL 中的 MVCC 是什么?的更多相关文章
- Mysql 中的MVCC原理,undo日志的依赖
一. MVCC 原理了解 原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...
- Mysql中MVCC的使用及原理详解
准备 测试环境:Mysql 5.7.20-log 数据库默认隔离级别:RR(Repeatable Read,可重复读),MVCC主要适用于Mysql的RC,RR隔离级别 创建一张存储引擎为test ...
- MYSQL中的乐观锁实现(MVCC)简析
https://segmentfault.com/a/1190000009374567#articleHeader2 什么是MVCC MVCC即Multi-Version Concurrency Co ...
- MySQL中的事务和MVCC
本篇博客参考掘金小册--MySQL 是怎样运行的:从根儿上理解 MySQL 以及极客时间--MySQL实战45讲. 虽然我们不是DBA,可能对数据库没那么了解,但是对于数据库中的索引.事务.锁,我们还 ...
- 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)
MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...
- 【MySQL】漫谈MySQL中的事务及其实现
最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySQL,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...
- MySQL 中隔离级别 RC 与 RR 的区别
1. 数据库事务ACID特性 数据库事务的4个特性: 原子性(Atomic): 事务中的多个操作,不可分割,要么都成功,要么都失败: All or Nothing. 一致性(Consistency): ...
- 漫谈MySql中的事务
最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...
- mysql中不同事务隔离级别下数据的显示效果--转载
事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...
- 浅谈mysql中不同事务隔离级别下数据的显示效果
事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...
随机推荐
- CPU的指令周期
本文分享自天翼云开发者社区<CPU的指令周期>,作者:冯****怡 指令周期(Instruction Cycle) CPU中会有 存器.指令寄存器.控制器等多类单元.指令集,就是CPU中用 ...
- 斩获“年度突破成果”奖!天翼云构建强大AI算力基础,制胜人工智能新时代
8月18-19日,2023中国算力大会在宁夏银川举办.在大会"年度突破成果"发布环节,中国电信天翼云<基于异构多云环境下的息壤算力调度应用实践>荣获2023中国算力大会 ...
- 闲话 4.12——对 Worpitzky 恒等式的几个证明
\[\sum_{i}\left\langle\begin{matrix}n\\i\end{matrix}\right\rangle \binom{i+k}{n}=k^n \] 通俗的证明(具体数学的习 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 24 期(2025年1.27-1.31)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- ABC391E题解
大概评级:绿. 题目传送门. 显然动态规划,设 \(f_{i,k}\) 表示经过 \(i\) 次变换后能将 \(a_k\) 取反的最大值,显然答案为 \(f_{n,1}\),状态转移很简单,枚举 \( ...
- swoole(5)信号监听、热重启
一:信号监听 信号:由用户.系统或者进程发给目标进程的信息,以通知目标进程某个状态的改变或系统异常 信号查看:kill -l SIGHUP 终止进程 终端线路挂断 SIGINT ...
- Oracle 23ai TPC-H 执行情况
TPC-H是一个广泛使用的基准测试,用于评估数据库系统在决策支持系统(DSS)场景下的性能. 在昨天的文章中,我们完成了<Oracle 23ai TPC-H 测试环境部署>,本文将继续记录 ...
- buuctf-web 解题过程
[SUCTF 2019]Upload Labs 2 源码 // admin.php <?php include 'config.php'; class Ad{ public $cmd; publ ...
- Loongson Log
就看看能坚持多久吧 22/2/2及以前: 参照想象中的p7内容增添部分版CP0.部分中断/异常机制: 改sram接口:查阅文档func_test.sram相关内容:查阅vivado bram IP核相 ...
- 超级详细的mysql数据库安装指南
https://zhuanlan.zhihu.com/p/37152572 2,073 人赞同了该文章 如果你的电脑是mac,参考社群会员 @奔跑的土豆 的分享: mac下mysql的安装步骤 227 ...