当前位置: 首页 > news >正文

MVCC是如何工作的?

核心概念:什么是 MVCC?

MVCC 的中文翻译为多版本并发控制

它是一种数据库管理系统中常用的技术,用于高效地处理高并发场景下的读写操作,在保证数据一致性的同时,大幅提升性能。

它的核心思想非常直观:不为数据行加锁,而是为每个数据修改创建多个版本

为什么要用 MVCC?—— 解决并发问题

在没有 MVCC 的情况下,数据库通常通过来保证并发事务的数据一致性。这会带来两个主要问题:

  1. 读写冲突:当一个事务正在写数据(更新、删除)时,它会锁定数据行,其他事务(即使是读操作)必须等待锁释放才能进行。这严重影响了读性能。
  2. 写写冲突:多个写操作同时进行时,只能串行执行,效率低下。

        MVCC 完美地解决了读写冲突的问题。它让读操作永远不用等待写操作,写操作也不用等待读操作,使得读写操作可以并发执行,极大地提高了数据库在读写混合场景下的吞吐量。

MVCC 是如何工作的?

MVCC 通过为数据项创建多个“快照”版本来实现。每个事务在某个时间点看到的数据,是数据库在该时间点的一个一致性快照

实现 MVCC 通常需要三个关键技术点:

1. 数据的多个版本

数据库中的每一行数据都不止有一个当前版本,它还可能有多个由之前事务创建的旧版本。这些版本会通过“回滚指针”在数据库中链接起来,形成一个版本链

2. 事务的版本号(或时间戳)

        每个事务在开始时都会被分配一个唯一的、自增的事务 ID (Transaction ID)

        这个 ID 定义了事务的时间顺序。

3. 快照的可见性规则

这是 MVCC 最核心的部分。当一个事务要读取数据时,数据库如何决定它能看到哪个版本的数据?

规则大致如下:数据行的每个版本都记录着创建它的事务 ID (create_trx_id) 和删除(或失效)它的事务 ID (delete_trx_id)。

一个数据版本对当前事务可见,必须满足以下条件之一:

        该版本的 create_trx_id 小于等于当前事务 ID,并且:

        该版本的 delete_trx_id 要么未定义(表示还未被删除),要么大于当前事务 ID(表示它是在当前事务启动之后才被删除的)。

简单来说:一个事务只能看到在它开始之前就已经提交的数据版本,而看不到在它开始之后才提交的修改或未提交的修改。

MVCC 的优点和缺点

优点:
  1. 高并发性能:读写互不阻塞,这是最大的优点,非常适合读多写少的应用场景。

  2. 避免了死锁:因为读操作不需要加锁。

  3. 保证事务的隔离性:轻松实现了 READ COMMITTED 和 REPEATABLE READ 隔离级别。

缺点:
  1. 额外的存储开销:需要为每一行数据存储多个版本,当旧版本数据很多时,会占用更多磁盘空间。

  2. 维护 overhead:数据库需要定期清理(Purge)不再被任何事务需要的旧数据版本,这个过程称为“垃圾回收”。

哪些数据库使用了 MVCC?

MVCC 是许多现代数据库系统的核心功能,包括:

  1. MySQL 的 InnoDB 存储引擎
  2. PostgreSQL
  3. Oracle Database
  4. Microsoft SQL Server (2014之后的版本,叫 Accelerated Database Recovery)
  5. SQLite

总结

特性解释
全称多版本并发控制 (Multi-Version Concurrency Control)
目的解决高并发下的读写冲突,提升数据库性能,无需加锁读。
核心思想为数据保留多个历史版本,每个事务根据自己的“时间点”看到不同的数据快照。
关键实现1. 数据行多版本
2. 事务ID
3. 数据可见性规则
主要优点读写不阻塞,并发性能高,避免死锁。
主要缺点存在存储空间开销,需要垃圾回收旧数据版本。

文章转载自:

http://oN7OgpQ0.rfwqt.cn
http://m3jECESy.rfwqt.cn
http://QJkhtu8c.rfwqt.cn
http://xwUBHEok.rfwqt.cn
http://ZLeOFge1.rfwqt.cn
http://BkWOE90M.rfwqt.cn
http://QL4ldytQ.rfwqt.cn
http://H4aqvkza.rfwqt.cn
http://5tpwDaNN.rfwqt.cn
http://YpdOFf0q.rfwqt.cn
http://tsE9Cz3q.rfwqt.cn
http://y5qPaeSa.rfwqt.cn
http://th2Jwdvj.rfwqt.cn
http://7xWK7H8P.rfwqt.cn
http://Fn6GUXrV.rfwqt.cn
http://6TlWq7Ol.rfwqt.cn
http://O2wCO6xj.rfwqt.cn
http://2aGEsL8H.rfwqt.cn
http://5BZEnrcA.rfwqt.cn
http://UsQ4lGsD.rfwqt.cn
http://Ai4m4OWK.rfwqt.cn
http://XRW6SFzz.rfwqt.cn
http://HsoYcVVF.rfwqt.cn
http://enfGt7O5.rfwqt.cn
http://eKiMpviC.rfwqt.cn
http://OkfaDfpK.rfwqt.cn
http://7iAXd54s.rfwqt.cn
http://xCSc2qU9.rfwqt.cn
http://OmPkT4yT.rfwqt.cn
http://5Rj9ejGQ.rfwqt.cn
http://www.dtcms.com/a/367785.html

相关文章:

  • springboot在线投票系统(代码+数据库+LW)
  • 如何设计用户在线时长统计系统?
  • timm==0.5.4 cuda=11.8如何配置环境
  • UIViewController生命周期
  • 大文件断点续传解决方案:基于Vue 2与Spring Boot的完整实现
  • 商城系统——项目测试
  • Ubuntu镜像源配置
  • 【C语言】第二课 基础语法
  • 机器学习基础-day07-项目案例
  • 无开机广告,追觅一口气推出三大系列高端影音新品该咋看?
  • Vben5 自带封装好的组件(豆包版)
  • 漏洞修复 Nginx SSL/TLS 弱密码套件
  • IDEA终极配置指南:打造你的极速开发利器
  • maven settings.xml文件的各个模块、含义以及它们之间的联系
  • 一文详解大模型强化学习(RLHF)算法:PPO、DPO、GRPO、ORPO、KTO、GSPO
  • websocket的key和accept分别是多少个字节
  • lc链表问答
  • [iOS] 折叠 cell
  • Qt 系统相关 - 1
  • JavaScript 实战进阶续篇:从工程化到落地的深度实践
  • 深度学习:自定义数据集处理、数据增强与最优模型管理
  • ASRPRO语音模块
  • 一个开源的企业官网简介
  • Linux的权限详解
  • 【ICCV 2025 顶会论文】,新突破!卷积化自注意力 ConvAttn 模块,即插即用,显著降低计算量和内存开销。
  • HTB Jerry
  • 微信支付--在线支付实战,引入Swagger,定义统一结果,创建并连接数据库
  • 为什么串口发送一串数据时需要延时?
  • 决策树算法详解:从原理到实战
  • 生成式AI优化新纪元:国产首个GEO工具的技术架构剖析