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_IDDB_ROLL_PTR

    • DB_TRX_ID:记录创建该行数据的事务 ID。
    • DB_ROLL_PTR:指向撤销日志的指针,帮助恢复数据行的历史版本。
  • 当一个事务修改数据时,InnoDB 并不会直接覆盖原有的数据行,而是创建一个新的版本。原有的数据行会通过撤销日志保留下来。

3. 读取数据的版本选择

  • 当一个事务进行读取操作时,MySQL 会选择该事务可见的最新版本。也就是说,只有在事务 ID 小于等于当前事务 ID 的数据版本才对当前事务可见。
  • 具体来说,如果一个事务在执行时遇到其他事务已经修改的数据,它会根据 版本号时间戳 来选择一个可见的版本:
    • 如果当前事务的 ID 小于数据行的 DB_TRX_ID,则当前事务不可见该数据行。
    • 如果当前事务的 ID 大于数据行的 DB_TRX_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 是什么?的更多相关文章

  1. Mysql 中的MVCC原理,undo日志的依赖

    一. MVCC 原理了解   原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...

  2. Mysql中MVCC的使用及原理详解

      准备 测试环境:Mysql 5.7.20-log 数据库默认隔离级别:RR(Repeatable Read,可重复读),MVCC主要适用于Mysql的RC,RR隔离级别 创建一张存储引擎为test ...

  3. MYSQL中的乐观锁实现(MVCC)简析

    https://segmentfault.com/a/1190000009374567#articleHeader2 什么是MVCC MVCC即Multi-Version Concurrency Co ...

  4. MySQL中的事务和MVCC

    本篇博客参考掘金小册--MySQL 是怎样运行的:从根儿上理解 MySQL 以及极客时间--MySQL实战45讲. 虽然我们不是DBA,可能对数据库没那么了解,但是对于数据库中的索引.事务.锁,我们还 ...

  5. 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)

    MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...

  6. 【MySQL】漫谈MySQL中的事务及其实现

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySQL,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  7. MySQL 中隔离级别 RC 与 RR 的区别

    1. 数据库事务ACID特性 数据库事务的4个特性: 原子性(Atomic): 事务中的多个操作,不可分割,要么都成功,要么都失败: All or Nothing. 一致性(Consistency): ...

  8. 漫谈MySql中的事务

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  9. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  10. 浅谈mysql中不同事务隔离级别下数据的显示效果

    事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...

随机推荐

  1. NIT GREAT NITYACKE DESTROYS THE UNIVERSE

    线段树 一般线段树维护的东西是什么?设其维护的信息的半群 \((A,+)\),维护标记的半群 \((T,\times)\) 和一种运算 \(*\mapsto A*T\to A\). 要求 \((b+c ...

  2. 使用iceberg-使用Iceberg数据湖需要注意的点

    一.资料准备 1.mysql地址选择 因为阿里云只读节点binlog保留时间短,需要用读写集群地址.可以登录阿里云控制台查看地址是只读还是读写,不清楚的话可以找dba要读写地址. 二.Iceberg概 ...

  3. Lombok 只会用@Setter @Getter @Data ? 老鸟带你玩转lombok

    lombok的官网 官方网址 : https://projectlombok.org lombok 稳定特性文档:https://projectlombok.org/features/ lombok ...

  4. 解决 Dell PowerEdge T630 增加第三方 PCIe 设备后制冷系统异常

    博客链接:解决 Dell PowerEdge T630 增加第三方 PCIe 设备后制冷系统异常 配置 Device: Dell PowerEdge T630 CPU: Intel(R) Xeon(R ...

  5. 面试题53 - I. 在排序数组中查找数字 I

    地址:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/ <?php /** 面试题53 ...

  6. Keepalived学习,双主热备高可用

    双主热备可以看做双机主备的升级(双机主备链接 https://www.cnblogs.com/hmxs/p/12041735.html),它是为了让两台设备都能提供服务,而不是主节点正常时,备用节点一 ...

  7. 对接服务升级后仅支持tls1.2,jdk1.7默认使用tls1.0,导致调用失败

    背景 如标题所说,我手里维护了一个重要的老项目,使用jdk1.7,里面对接了很多个第三方服务,协议多种多样,其中涉及http/https的,调用方式也是五花八门,比如:commons-httpclie ...

  8. Web前端入门第 16 问:学会使用开发者工具调试 HTML 页面

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 有没有好奇,前面文章中的截图是怎么来的?怎样查看 HTML 的渲染结果? Web 开发者的照妖镜 曾经火狐( F ...

  9. Windows 提权-内核利用_2

    本文通过 Google 翻译 Kernel Exploits Part 2 – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...

  10. 如何调用CMD实现多个同类文件合并的研究 · 二进制 · 依次 · 文本图像视频音频

    引言 视频网站内,使用视频下载嗅探器下载了视频,打开资源管理器一看,是几千个.ts文件,见下图:   通过播放部分视频,发现其实内容是完整的,只是自动切割了多份,倘若无缝拼接为一个完整视频单元,就可以 ...