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

MVCC(多版本并发控制)

MVCC(多版本并发控制)是数据库实现高并发事务的核心技术之一,其核心是通过数据多版本解决读写冲突。以下从‌技术原理、实现细节、应用场景、优缺点‌四个方面深入解析。


一、技术原理

1. ‌核心思想
  • 数据多版本化‌:每次数据修改(增删改)时,生成一个新版本的数据,旧版本保留(通过指针或隐藏字段链接)。
  • 读操作基于快照‌:每个事务启动时获取一个“快照”(Snapshot),后续读操作仅基于该快照的数据版本,不阻塞写操作。
2. ‌关键组件
  • 事务ID(Transaction ID)‌:每个事务启动时分配唯一递增的ID,标记事务的时间顺序。
  • 版本链(Version Chain)‌:每条数据维护多个版本,通过指针链接历史版本(类似链表)。
  • Read View(读视图)‌:事务启动时生成,用于判断哪些版本的数据对该事务可见。
    • 包含活跃事务ID列表(未提交的事务)。
    • 记录当前最小事务ID(up_limit_id)和最大事务ID(low_limit_id)。

二、实现细节(以MySQL InnoDB为例)

1. ‌数据存储结构
  • 隐藏字段‌:
    • DB_TRX_ID:最近修改该数据的事务ID。
    • DB_ROLL_PTR:回滚指针,指向旧版本数据的undo log(版本链入口)。
    • 示例:某行数据的隐藏字段为 DB_TRX_ID=200DB_ROLL_PTR=0x1234,表示该版本由事务200修改,旧版本存储在undo log地址0x1234。
2. ‌版本链与undo log
  • undo log(回滚日志)‌:存储数据修改前的旧版本,构成版本链。
    • INSERT操作:undo log记录删除信息。
    • DELETE/UPDATE操作:undo log记录旧数据。
  • 版本链遍历‌:事务读取数据时,通过DB_ROLL_PTR依次回溯undo log,找到符合可见性条件的版本。
3. ‌Read View可见性规则

事务读取数据时,根据Read View判断版本可见性:

  • 如果数据版本的DB_TRX_ID < up_limit_id:该版本在事务启动前已提交,‌可见‌。
  • 如果数据版本的DB_TRX_ID >= low_limit_id:该版本在事务启动后生成,‌不可见‌。
  • 如果up_limit_id ≤ DB_TRX_ID < low_limit_id
    • DB_TRX_ID在活跃事务列表中:该版本由未提交事务生成,‌不可见‌。
    • 否则:事务已提交,‌可见‌。
4. ‌不同隔离级别的实现
  • 读已提交(Read Committed)‌:每次读操作生成新的Read View。
  • 可重复读(Repeatable Read)‌:事务首次读操作生成Read View,后续复用该视图。

三、应用场景

1. ‌高并发读写
  • 示例:电商系统库存扣减,大量用户并发查询库存(读)和下单(写),MVCC避免读写锁竞争。
2. ‌长事务与一致性快照
  • 示例:数据分析事务需要长时间运行,MVCC保证其读取的数据始终是启动时的快照版本。
3. ‌避免锁带来的死锁
  • MVCC通过版本控制减少行锁使用,降低死锁概率。

四、优缺点

优点
  1. 高并发‌:读写操作互不阻塞。
  2. 一致性快照‌:支持可重复读和读已提交隔离级别。
  3. 避免死锁‌:减少锁的依赖。
缺点
  1. 存储开销‌:需存储多版本数据和undo log。
  2. 版本回收‌:需要定期清理旧版本(如MySQL的Purge线程)。
  3. 写冲突处理‌:仍需锁机制处理写-写冲突(如悲观锁或乐观锁)。

五、对比其他并发控制机制

机制MVCC锁机制(2PL)
读写冲突处理读不阻塞写,写不阻塞读读阻塞写,写阻塞读
性能高并发场景性能更优高锁竞争时性能下降
一致性基于快照的隔离级别严格串行化(Serializable)
适用场景读多写少,长事务写密集型,强一致性要求

六、实际案例分析

MySQL的MVCC实现
  1. 插入操作‌:生成新数据版本,旧版本为空。
  2. 更新操作‌:
    • 原数据行的DB_TRX_ID标记为当前事务ID。
    • 旧数据存入undo log,DB_ROLL_PTR指向undo log地址。
  3. 删除操作‌:标记数据为删除状态,旧版本保留在undo log中。
  4. 查询操作‌:遍历版本链,找到符合Read View的最新可见版本。
PostgreSQL的MVCC实现差异
  • 通过事务ID(XID)和元组可见性规则实现。
  • 旧版本数据直接存储在表中,通过xminxmax字段标记事务范围。
  • 需要VACUUM进程清理旧版本数据。

七、总结

  • MVCC本质‌:用空间换时间,通过多版本数据降低锁竞争。
  • 核心价值‌:在高并发场景下,平衡一致性、隔离性和性能。
  • 适用性‌:适合读多写少、需要非阻塞读的场景(如OLTP系统)。
http://www.xdnf.cn/news/2564.html

相关文章:

  • docker部署Mysql8一直密码错误记录
  • 实时操作系统在金融科技中的应用及未来展望
  • Coding Practice,48天强训(25)
  • [Jupyter Notebook]:Jupyter Notebook 安装教程(代码编辑器)
  • 【C++底层】底层的编译逻辑和过程
  • OnlyOffice Document Server 开发版:连接器使用-ARM和x86双模式安装指南
  • C盘清理实用技巧整理
  • 卡洛诗西餐厅,以“中式西餐”为核心战略
  • 如何理解promise 续一
  • 准确--如何在 Windows 上安装并管理多个 Python 环境
  • 【SpringMVC文件上传终极指南:从基础配置到云存储集成】
  • 在亚马逊云服务器上部署WordPress服务
  • Pikachu靶场-目录遍历
  • WPF-遵循MVVM框架创建图表的显示【保姆级】
  • 【学习笔记】计算机操作系统(一)—— 操作系统引论
  • dify实际开发中遇见的几个小问题
  • 基于ART光学跟踪系统打造具有开创性的人车互动VR解决方案
  • 产品经理面经(1)
  • 使用Nestjs, Bun 和 NCC 打造高效的 Node.js 应用构建流程
  • Shell脚本-while循环应用案例
  • Python入门基础
  • w~嵌入式C语言~合集4
  • 深度解析:Web Crawling与Web Scraping的区别与联系
  • 数据结构二叉树与二叉搜索树c实现代码
  • SVT-AV1源码分析-函数svt_aom_motion_estimation_kernel
  • 解决Keil/MDK无法跳转(go to define)问题
  • 2025年AEJ SCI2区:增强麻雀搜索算法CERL-SSA+工业物联网感知通信,深度解析+性能实测
  • SpringBoot配置RestTemplate并理解单例模式详解
  • layui获取无法获取表单数据,data.field一直为空
  • SPL 量化 复权数据