【mysql中mvcc的含义和作用及原理】

news/2025/2/24 20:41:14

MySQL中的MVCC(多版本并发控制)是一种用于提高数据库并发性能的机制,通过维护数据的多个版本,实现读写操作的无锁并发。以下是其核心要点:


1. MVCC的含义

  • 全称:Multi-Version Concurrency Control(多版本并发控制)
  • 目标:在高并发场景下,避免读写冲突,减少锁竞争,提升性能。
  • 适用引擎:InnoDB存储引擎支持,主要用于事务的**读已提交(RC)可重复读(RR)**隔离级别。

2. MVCC的作用

  • 无锁并发:读操作(快照读)无需加锁,写操作按需加锁,减少阻塞。
  • 隔离性实现:通过版本控制,实现不同事务隔离级别的数据可见性规则。
    • 读已提交(RC):每次读操作获取最新已提交的数据。
    • 可重复读(RR):事务首次读操作建立一致性快照,后续读操作基于此快照。
  • 解决部分幻读:RR级别下,通过快照避免大部分幻读,结合间隙锁彻底解决幻读。

3. MVCC的原理

核心机制
  • 隐藏字段
    • DB_TRX_ID:记录最后一次修改该行的事务ID。
    • DB_ROLL_PTR:指向Undo Log中旧版本数据的指针。
    • DB_ROW_ID:隐含的行ID(若无主键时自动生成)。
  • Undo Log:存储数据的历史版本,用于回滚和版本链追溯。
  • Read View:事务执行快照读时生成的一致性视图,决定数据可见性。

Read View的组成
  • trx_ids:生成Read View时活跃(未提交)的事务ID列表。
  • low_limit_id:当前系统最大事务ID+1。
  • up_limit_id:活跃事务中最小的ID。
  • creator_trx_id:创建该Read View的事务ID。

可见性判断规则

对于某行数据的DB_TRX_ID

  1. 如果 DB_TRX_ID < up_limit_id:该版本在Read View创建前已提交,可见
  2. 如果 DB_TRX_ID ≥ low_limit_id:该版本在Read View创建后修改,不可见
  3. 如果 up_limit_id ≤ DB_TRX_ID < low_limit_id
    • DB_TRX_IDtrx_ids中:说明事务未提交,不可见
    • 否则:事务已提交,可见
  4. 对当前事务自身修改的数据,始终可见。

不同隔离级别的行为
  • 读已提交(RC)
    • 每次执行SELECT都会生成新的Read View,读取已提交的最新数据。
  • 可重复读(RR)
    • 事务首次SELECT时生成Read View,后续操作复用该视图,保证一致性快照。

版本链遍历
  • 通过DB_ROLL_PTR指针访问Undo Log中的旧版本,按规则依次判断可见性。
  • 若某个版本对当前事务不可见,则继续回溯更早版本,直到找到可见的版本或到达链头。

4. MVCC的优缺点

  • 优点
    • 读操作无锁,减少阻塞,提高并发性能。
    • 支持非锁定一致性读,适合读多写少场景。
  • 缺点
    • 维护多版本数据增加存储开销(Undo Log)。
    • 频繁的版本清理(Purge机制)可能影响性能。

5. 示例场景

  • 事务A(RR级别)
    1. 开启事务,读取某行数据(生成Read View)。
    2. 事务B修改该行并提交。
    3. 事务A再次读取时,由于Read View未更新,仍看到旧版本数据。
  • 事务A(RC级别)
    1. 开启事务,第一次读取数据。
    2. 事务B修改并提交后,事务A再次读取会生成新Read View,看到新数据。

总结

MVCC通过维护数据多版本和Read View机制,实现了高效的无锁并发读写,平衡了事务隔离与性能。理解其原理对优化事务设计和排查并发问题至关重要。


http://www.niftyadmin.cn/n/5864800.html

相关文章

基于ffmpeg+openGL ES实现的视频编辑工具-添加背景音乐(十一)

在视频编辑领域,为视频添加背景音乐并实现音频的完美融合是一项关键任务。在上一篇文章中,我们大体介绍了添加背景音乐的整体逻辑,而本文将深入探讨其中音频合并所依赖的滤镜逻辑,通过对相关代码的详细解读,揭示音频合并的核心技术。 一、音频合并滤镜类的初始化 AudioA…

新能源汽车核心元件揭秘:二极管、三极管结构与工作原理解析(2/2)

上一节我们讲了二极管的原理, 原文章: https://zhuanlan.zhihu.com/p/25252117833 看了的朋友应该很容易懂这节课 这篇文章我们来说说三极管的工作原理啊 这里要说下几个概念 1 半导体的导通, 就是说里面的负电荷电子和正电荷空穴可以大量的从 一个地方达到我们想要的地方…

Flink JobManager不稳定的典型情景

概述 Flink JobManager作为作业调度的核心组件&#xff0c;其不稳定性通常由作业设计、资源分配或运行时的极端场景引发。 本文介绍可能导致 JobManager 不稳定的典型场景。 情景1&#xff1a; 大规模作业的元数据压力 场景描述&#xff1a; 如果作业的拓扑结构过于复杂&…

【Linux】基于UDP/TCP服务器与客户端的实现

目录 一、UDP &#xff08;一&#xff09;Server.hpp &#xff08;二&#xff09;Server.cpp &#xff08;三&#xff09;Client.hpp &#xff08;四&#xff09;Client.cpp &#xff08;五&#xff09;User.hpp 二、TCP &#xff08;一&#xff09;多进程版本的服务器与…

Leetcode 3464. Maximize the Distance Between Points on a Square

Leetcode 3464. Maximize the Distance Between Points on a Square 1. 解题思路2. 代码实现 题目链接&#xff1a;3464. Maximize the Distance Between Points on a Square 1. 解题思路 说来惭愧&#xff0c;这道题我也没有自力搞定&#xff0c;也是问了一下DeepSeek R1之…

模型思维 - 领域模型的应用与解析

文章目录 引言模型的核心作用与价值四大模型类型UML建模工具UML类图的核心价值类关系深度剖析企业级建模实践 领域模型&#xff08;推荐&#xff09; vs 数据模型&#xff08;不推荐&#xff09;区别联系错把领域模型当数据模型错误方案 vs 正确方案对比正确方案的实现1. 数据库…

苍穹外卖中的模块总结

本文总结苍穹外卖项目中可复用的通用设计 sky-common constant存放常量类&#xff0c;包括消息常量&#xff0c;状态常量 context是上下文对象&#xff0c;封装了threadlocal package com.sky.context;public class BaseContext {public static ThreadLocal<Long> thre…

毕业项目推荐:基于yolov8/yolov5/yolo11的番茄成熟度检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…