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查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...
随机推荐
- C# WebAPI 插件热插拔
背景 WebAPI 插件热插拔是指在不重启应用程序的情况下,能够动态地加载.更新或卸载功能模块(即插件)的能力.这种设计模式在软件开发中非常有用,尤其是在需要频繁更新或扩展功能的大型系统中.通过实现插 ...
- dart箭头函数和自执行函数的详解
01==>箭头函数 // List list = ['苹果', '香蕉', '栗子']; // list.forEach((element) { // print(element); // }) ...
- 绕过 console-ban
绕过 console-ban console-ban 项目介绍 console-ban 是一个高效且轻量级的 JavaScript 库,其核心功能是有效阻止用户通过浏览器的开发者工具(例如按 F12 ...
- Whois 收集
Whois 收集 Whois是什么 Whois(读作"Who is")是一个标准的互联网协议,主要用于查询域名的注册信息,包括域名所有人.注册商.注册时间.过期时间等详细信息.简单 ...
- 概率学习(Genshin中)
目前待补充:停时定理的部分例题. 定义 首先定义样本空间 \(\Omega\),是所有样本点(结果)的集合. 随机事件 \(A\) 是样本空间的子集. 定义事件和为事件并,积为事件交. 事件域 \(\ ...
- mysql之数据连接池
数据库连接池 C3P0: 配置文件 <?xml version="1.0" encoding="UTF-8"?> <c3p0-config&g ...
- 最优化算法Nesterov Momentum牛顿动量法
这是对之前的Momentum的一种改进,大概思路就是,先对参数进行估计,然后使用估计后的参数来计算误差 具体实现: 需要:学习速率 ϵ, 初始参数 θ, 初始速率v, 动量衰减参数α每步迭代过程:
- scala - [01] 概述
题记部分 001 || 介绍 (1)Spark -- 新一代内存级大数据计算框架,是大数据的重要内容 (2)Spark就是使用Scala编写的.因此为了更好的学习Spark,需要掌握Scala. (3 ...
- Flink - [08] 状态一致性
题记部分 一.什么是状态一致性 有状态的流处理,内部每个算子任务都可以有自己的状态.对于流处理器内部来说,所谓的状态一致性,其实就是我们所说的计算结果要保证准确.一条数据也不应该丢失,也不应该重复 ...
- Spark - spark on yarn 的作业提交流程
YarnClient YarnCluster 客户端(Client)通过YARN的ResourceManager提交应用程序.在此过程中,客户端进行权限验证,生成Job ID和资源上传路径,并将这些信 ...