MySQL的MVCC机制详解

1. 什么是MVCC?

MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库系统中用于实现并发控制的一种技术。它通过保存数据在某个时间点的快照来实现,使得在同一个数据行上可以同时存在多个版本,从而允许读操作不会阻塞写操作,写操作也不会阻塞读操作,提高了数据库的并发性能。

2. MVCC在MySQL中的应用

在MySQL中,MVCC主要应用于InnoDB存储引擎,用于实现事务的隔离级别,特别是“可重复读(REPEATABLE READ)”和“读已提交(READ COMMITTED)”隔离级别。MVCC通过为每行记录添加额外的版本信息来实现,使得不同事务可以访问到不同版本的数据。

3. MVCC的实现原理

3.1 版本链

在InnoDB中,每行记录除了存储实际数据外,还包含几个隐藏字段:

  • DB_TRX_ID:最近一次修改该行记录的事务ID。
  • DB_ROLL_PTR:回滚指针,指向该行记录的上一个版本,用于构建版本链。
  • DB_ROW_ID:行ID,如果表没有定义主键,InnoDB会自动生成一个行ID作为聚簇索引。
3.2 Undo日志

Undo日志用于记录数据被修改前的值,以便在事务回滚时恢复数据。同时,Undo日志也用于实现MVCC,通过回滚指针(DB_ROLL_PTR)将不同版本的数据行连接起来,形成一个版本链。

3.3 Read View

Read View是事务在某一时刻对数据库的一个快照,用于判断当前事务能够看到哪些版本的数据。Read View主要包含以下几个关键信息:

  • m_ids:当前活跃事务ID的列表,即那些尚未提交的事务ID。
  • min_trx_idm_ids中的最小事务ID。
  • max_trx_id:系统应该分配给下一个事务的ID值。
  • creator_trx_id:创建该Read View的事务ID。

4. 如何判断数据版本是否可见

当事务执行一个查询操作时,会生成一个Read View,然后通过以下规则判断数据行的某个版本是否可见:

  1. 如果数据行版本的事务ID(DB_TRX_ID)小于min_trx_id,表示该版本是已提交事务的修改,因此该版本对当前事务可见。
  2. 如果数据行版本的事务ID(DB_TRX_ID)大于等于max_trx_id,表示该版本是当前事务开始之后才开启的事务的修改,因此该版本对当前事务不可见。
  3. 如果数据行版本的事务ID(DB_TRX_ID)在min_trx_idmax_trx_id之间,需要进一步判断:
    • 如果DB_TRX_IDm_ids列表中,表示该版本是由当前活跃事务修改的,因此该版本对当前事务不可见。
    • 如果DB_TRX_ID不在m_ids列表中,表示该版本是已提交事务的修改,因此该版本对当前事务可见。
  4. 如果数据行版本的事务ID(DB_TRX_ID)等于creator_trx_id,表示该版本是当前事务自己修改的,因此该版本对当前事务可见。

如果当前版本不可见,则通过回滚指针(DB_ROLL_PTR)找到上一个版本,并重复上述判断过程,直到找到一个可见的版本或到达版本链的末尾。

5. 不同隔离级别下MVCC的行为

5.1 读已提交(READ COMMITTED)

在“读已提交”隔离级别下,每次执行查询操作时都会生成一个新的Read View。因此,一个事务可以看到其他事务已提交的修改。

5.2 可重复读(REPEATABLE READ)

在“可重复读”隔离级别下,一个事务在第一次执行查询操作时生成一个Read View,并在整个事务期间都使用这个Read View。因此,一个事务在事务期间看到的数据是一致的,不会看到其他事务已提交的修改。

6. 示例

假设有以下事务操作:

  1. 事务1(事务ID为100)将某行记录的值从A修改为B。
  2. 事务2(事务ID为101)将同一行记录的值从B修改为C。

此时,该行记录的版本链可能如下:

  • 版本1:值A,事务ID为99,回滚指针指向NULL。
  • 版本2:值B,事务ID为100,回滚指针指向版本1。
  • 版本3:值C,事务ID为101,回滚指针指向版本2。

如果当前有一个事务3(事务ID为102)执行查询操作,其Read View的m_ids为[100, 101],min_trx_id为100,max_trx_id为103,creator_trx_id为102。事务3将按照以下步骤判断:

  1. 首先检查版本3,其事务ID为101,在m_ids列表中,因此不可见。
  2. 通过回滚指针找到版本2,其事务ID为100,同样在m_ids列表中,因此也不可见。
  3. 再通过回滚指针找到版本1,其事务ID为99,小于min_trx_id,因此可见,事务3将看到值A。

7. MVCC的优点

  1. 提高并发性能:读操作不会阻塞写操作,写操作也不会阻塞读操作。
  2. 避免脏读、不可重复读和幻读:通过版本控制,事务可以看到一致的数据视图。

8. 总结

MVCC是MySQL InnoDB存储引擎实现高并发事务处理的关键技术之一。通过保存数据行的多个版本,并利用Read View来判断数据版本的可见性,MVCC使得数据库在保证事务隔离性的同时,提高了并发性能。理解MVCC的实现原理,有助于我们更好地理解MySQL的事务处理机制,并优化数据库的并发性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言数字图像处理---2.31统计滤波器

本文介绍空域滤波器中的一种:统计滤波器 [定义与算法] 统计滤波(Statistic Filter)定义:基于图像处理中的邻域统计方法,对邻域内的像素信息进行统计,如基于均值和方差的信息,用于平滑或去噪图像,同时保留边缘信息。 算法步骤如下: 统计滤波器的优点和缺点主要包…

计算机视觉相机模型与标定:如何让计算机“看懂”三维世界?

计算机视觉相机模型与标定:如何让计算机“看懂”三维世界? 一、前言二、相机模型基础​2.1 针孔相机模型​2.1.1 模型原理​2.1.2 代码示例​2.2 透视变换与相机内参​2.2.1 透视变换矩阵​2.2.2 内参矩阵的作用​2.3 相机外参​2.3.1 世界坐标系与相机坐标系的转换​2.3.2 外…

DeepSpeed ZeRO++:降低4倍网络通信,显著提高大模型及类ChatGPT模型训练效率

图1: DeepSpeed ZeRO 简介 大型 AI 模型正在改变数字世界。基于大型语言模型 (LLM)的 Turing-NLG、ChatGPT 和 GPT-4 等生成语言模型用途广泛,能够执行摘要、代码生成和翻译等任务。 同样,DALLE、Microsoft Designer 和 Bing Image Creator 等大型多模…

Seq2Seq - 编码器(Encoder)和解码器(Decoder)

本节实现一个简单的 Seq2Seq(Sequence to Sequence)模型 的编码器(Encoder)和解码器(Decoder)部分。 重点把握Seq2Seq 模型的整体工作流程 理解编码器(Encoder)和解码器&#xff08…

Spring Boot集成MinIO的详细步骤

1. 安装MinIO 使用Docker部署MinIO 拉取MinIO镜像: docker pull minio/minio 这将从Docker Hub中获取最新的MinIO镜像。 创建目录: mkdir -p /home/minio/config mkdir -p /home/minio/data 这些目录将用于持久化MinIO的数据和配置文件 创建MinIO…

基于PLC的停车场车位控制系统的设计

2.1 设计目标 本课题为基于PLC的停车场车位控制系统来设计,在此将功能确定如下: 针对8个车位的停车场进行设计将停车场分为入口处,车位处、以及出口处三个部分;每个车位都有指示灯指示当前位置是否空闲,方便司机查找空…

微服务即时通信系统---(四)框架学习

目录 ElasticSearch 介绍 安装 安装kibana ES客户端安装 头文件包含和编译时链接库 ES核心概念 索引(Index) 类型(Type) 字段(Field) 映射(mapping) 文档(document) ES对比MySQL Kibana访问ES测试 创建索引库 新增数据 查看并搜索数据 删除索引 ES…

除了 `task_type=“SEQ_CLS“`(序列分类),还有CAUSAL_LM,QUESTION_ANS

task_type="SEQ_CLS"是什么意思:QUESTION_ANS 我是qwen,不同模型是不一样的 SEQ_CLS, SEQ_2_SEQ_LM, CAUSAL_LM, TOKEN_CLS, QUESTION_ANS, FEATURE_EXTRACTION. task_type="SEQ_CLS" 通常用于自然语言处理(NLP)任务中,SEQ_CLS 是 Sequence Classif…

Android ViewPager使用预加载机制导致出现页面穿透问题

​ 缘由 在应用中使用ViewPager,并且设置预加载页面。结果出现了一些异常的现象。 我们有4个页面,分别是4个Fragment,暂且称为FragmentA、FragmentB、FragmentC、FragmentD,ViewPager在MainActivity中,切换时&#x…

apt3.0和apt2.0的区别

一,简单区别 更新方式 apt2.0:一次性更新所有内容,没有分阶段更新功能。apt3.0:引入分阶段更新功能,可分批推送更新包。 界面显示 apt2.0:界面简单,输出信息较为杂乱,没有彩色高亮和…

过电压保护器与传统的保护方式对比

过电压保护器主要用于保护电气设备免受大气过电压(如雷击)和操作过电压(开关动作等引发)的侵害。它通常由非线性电阻片等元件组成,利用其独特的伏安特性工作。正常电压下,保护器呈现高阻态,几乎…

机器学习(3)——决策树

文章目录 1. 决策树基本原理1.1. 什么是决策树?1.2. 决策树的基本构成:1.3. 核心思想 2. 决策树的构建过程2.1. 特征选择2.1.1. 信息增益(ID3)2.1.2. 基尼不纯度(CART)2.1.3. 均方误差(MSE&…

充电桩领域垂直行业大模型分布式推理与训练平台建设方案 - 慧知开源充电桩平台

没有任何广告! 充电桩领域垂直行业大模型分布式推理与训练平台建设方案 一、平台定位与核心价值 行业首个垂直化AI平台 专为充电桩运营场景设计的分布式大模型训练与推理基础设施,实现"算力-算法-场景"三位一体闭环管理。 核心价值主张&am…

NLP高频面试题(四十五)——PPO 算法在 RLHF 中的原理与实现详解

近端策略优化(Proximal Policy Optimization, PPO)算法是强化学习领域的一种新颖且高效的策略优化方法,在近年大规模语言模型的人类反馈强化学习(Reinforcement Learning with Human Feedback, RLHF)中发挥了关键作用。本文将以学术严谨的风格,详细阐述 PPO 算法的原理及…

C++指针和引用之区别(The Difference between C++Pointers and References)

面试题:C指针和引用有什么区 C指针和引用有什么区别? 在 C 中,指针和引用都是用来访问其他变量的值的方式,但它们之间存在一些重要的区别。了解这些区别有助于更好地理解和使用这两种工具。 01 指针 指针(Pointer…

LWIP学习笔记

TCP/ip协议结构分层 传输层简记 TCP:可靠性强,有重传机制 UDP:单传机制,不可靠 UDP在ip层分片 TCP在传输层分包 应用层传输层网络层,构成LWIP内核程序: 链路层;由mac内核STM芯片的片上外设…

【经验记录贴】活用shell,提高工作效率

背景 最近在做测试的时候,需要手动kill服务的进程,然后通过命令重启服务,再进行测试。每次重启都会涉及到下面三个命令的执行: 1)检索进程ID $ ps -eLf | grep programname root 1123 112 1234 0 0 0 0:00…

MacOS 系统下 Git 的详细安装步骤与基础设置指南

MacOS 系统下 Git 的详细安装步骤与基础设置指南—目录 一、安装 Git方法 1:通过 Homebrew 安装(推荐)方法 2:通过 Xcode Command Line Tools 安装方法 3:手动下载安装包 二、基础配置1. 设置全局用户名和邮箱2. 配置 …

一文读懂 AI

2022年11月30日,OpenAI发布了ChatGPT,2023年3月15日,GPT-4引发全球轰动,让世界上很多人认识了ai这个词。如今已过去快两年半,AI产品层出不穷,如GPT-4、DeepSeek、Cursor、自动驾驶等,但很多人仍…

【教程】检查RDMA网卡状态和测试带宽 | 附测试脚本

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 检查硬件和驱动状态 测试RDMA通信 报错修复 对于交换机的配置,可以看这篇: 【教程】详解配置多台主机通过交换机实现互…