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

MySQL-多版本并发控制MVCC

文章目录

  • 一、多版本并发控制MVCC
  • 二、undo log(回滚日志)
  • 二、已提交读
  • 三、可重复读
  • 总结


一、多版本并发控制MVCC

MVCC是多版本并发控制(Multi-Version Concurrency Control),是MySQL中基于乐观锁理论实现隔离级别的方式,用于实现已提交读和可重复读隔离级别的实现,也经常称为多版本数据库。MVCC机制会生成一个数据请求时间点的一致性数据快照 (Snapshot), 并用这个快照来提供一定级别 (语句级或事务级) 的一致性读取。从用户的角度来看,好象是数据库可以提供同一数据的多个版本(系统版本号和事务版本号)。事务的隔离性就是锁机制加MVCC体现的。
MVCC多版本并发控制中,读操作可以分为两类:
1、快照读(snapshot read)
读的是记录的数据快照,可以理解给数据拍了一张照片,不用加锁。如select
2、当前读(current read)
读取的是当前事务记录的最新数据库版本,并且返回第一次select数据快照的记录。如insert,delete,update,select…lock in share mode/for update

已提交读和可重复读的底层实现原理:通过MVCC多版本并发控制实现并发读取方式:快照读。InnoDB提供了两个读取操作:锁定读非锁定读。锁定读相关内容在锁机制里有提到,间隙锁、排它锁与共享锁等;非锁定读就是MVCC提供的快照读,它实现依赖于依赖底层的一个技术,undolog回滚日志;
undolog回滚日志的主要作用:事务发生错误时回滚rollback,提供MVCC的非锁定读(快照读),查快照上的数据而不是最新的数据;

二、undo log(回滚日志)

undo log:回滚日志,保存了事务发生之前的数据的一个版本,用于事务执行时的回滚操作,也就是rollback操作;同时也是实现多版本并发控制(MVCC)下读操作的关键技术,提供MVCC的非锁定读(快照读)。
实现回滚日志的两个关键:DB_TRX_ID:事务IDDB_ROLL_PTR:回滚指针

在这里插入图片描述

通过上面的图片可以了解到,每一行记录实际上有多个版本,每个版本的记录除了数据本身之外,增加了其它字段 ;在记录行中隐式的记录了事务ID和回滚指针,这些隐式数据是给MySQL看的:
1、开启事务时,MySQL会给事务分配事务ID,同一个事务的事务ID是不变的,不同的事务ID不同;
2、事务修改后的数据,放在表中原来的位置上,修改之前的数据会被放置在undo log中(缓存中);旧数据与新数据通过回滚指针链接,类似链表的结构,通过链表就可以找到之前的旧数据,实现回滚操作;

二、已提交读

已提交读:可以解决事务并行的脏读问题,但是不能解决不可重复读和幻读问题。

//设置事务的隔离级别为 已提交读
set tx_isolation='READ_COMMITTED';

1、已提交读如何解决脏读问题?
每次select都会产生一次新的数据快照,前提是数据被事务成功commit过了,在数据没有被commit之前,每次读的数据都是第一次select的结果;当事务成功commit之后,select产生最新的数据快照,此时会发生不可重复读、幻读
2、为什么已提交读无法解决不可重复读、幻读?
因为每次select都会产生一次新的数据快照,其它事务更新以后成功commit,会导致当前事务再select的时候产生了数据更新后的数据快照,从而发生不可重复读和幻读。

三、可重复读

可重复读:可以解决事务并发产生的脏读、不可重复读问题;一定程度上解决幻读问题。

//设置事务的隔离级别为 可重复读
set tx_isolation='REPEATABLE-READ';

1、如何解决脏读问题?
也是通过数据快照解决的脏读问题;
2、如何解决不可重复读?
可重复读隔离级别下,数据快照只在第一次select时候产生,不会因为其它事务成功commit就改变当前的数据快照。当前事务再次select时,仍然查看的是第一次select的数据快照。
3、为什么能部分解决幻读问题?
但是在事务执行update时,进行当前读,会读取到其它事务成功commit的数据;此时当前的事务发生更新,再执行select时,会将修改后的数据也显示出来,显示的结果就是第一次select的数据快照和修改后的数据


总结

由于MVCC,所以每一行记录实际上有多个版本,快照内容读取原则:
1、版本未提交无法读取生成快照 ;
2、版本已提交,但是在快照创建后提交的,无法读取 ;
3、版本已提交,但是在快照创建前提交的,可以读取 。所以在已提交读隔离级别下会产生不可重复读;
4、当前事务内自己的更新,可以读到 。所以在可重复读隔离级别下会产生幻读。

相关文章:

MySQL-多版本并发控制MVCC

文章目录 一、多版本并发控制MVCC二、undo log(回滚日志)二、已提交读三、可重复读总结 一、多版本并发控制MVCC MVCC是多版本并发控制(Multi-Version Concurrency Control),是MySQL中基于乐观锁理论实现隔离级别的方…...

Sherpa简介

Sherpa 是一个由 K2-FSA 团队 开发的 开源语音处理框架,旨在解决传统语音识别工具(如 Kaldi)在模型部署和跨平台适配中的复杂性问题。它通过整合现代深度学习技术和高效推理引擎,提供了从语音识别、合成到说话人识别的一站式解决方…...

4.15redis点评项目下

--->接redis点评项目上 Redis优化秒杀方案 下单流程为:用户请求nginx--->访问tomcat--->查询优惠券--->判断秒杀库存是否足够--->查询订单--->校验是否是一人一单--->扣减库存--->创建订单 以上流程如果要串行执行耗时会很多&#xff0c…...

目标检测与分割:深度学习在视觉中的应用

🔍 PART 1:目标检测(Object Detection) 1️⃣ 什么是目标检测? 目标检测是计算机视觉中的一个任务,目标是让模型“在图像中找到物体”,并且判断: 它是什么类别(classif…...

SpringBoot 与 Vue3 实现前后端互联全解析

在当前的互联网时代,前后端分离架构已经成为构建高效、可维护且易于扩展应用系统的主流方式。本文将详细介绍如何利用 SpringBoot 与 Vue3 构建一个前后端分离的项目,展示两者如何通过 RESTful API 实现无缝通信,让读者了解从环境搭建、代码实…...

HEIF、HEIC、JPG 和 PNG是什么?

1. HEIF (High Efficiency Image Format) 定义:HEIF 是一种用于存储单张图像和图像序列(如连拍照片)的图像文件格式。优势:相比传统的图像格式,HEIF 提供了更高的压缩效率和更好的图像质量。压缩算法:HEI…...

第一层、第二层与第三层隧道协议

(本文由deepseek生成,特此声明) 隧道协议是网络通信中用于在不同网络间安全传输数据的关键技术,其工作层次决定了封装方式、功能特性及应用场景。本文将详细介绍物理层(第一层)、数据链路层(第…...

部署qwen2.5-VL-7B

简单串行执行 from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info import torch, time, threadingdef llm(model_path,promptNone,imageNone,videoNone,imagesNone,videosNone,max_new_tokens2048,t…...

记录jdk8->jdk17 遇到的坑和解决方案

最近项目在升级jdk8->jdk17 springboot2->springboot3 顺序先升级业务服务,后升级组件服务。跟随迭代开发一起验证功能。 1. 使用parent pom 版本管理 spring相关组件的版本。 组件依赖低版本parent不变。 业务服务依赖高版本parent。 2. 修改maven jdk…...

vue3 uniapp vite 配置之定义指令

动态引入指令 // src/directives/index.js import trim from ./trim;const directives {trim, };export default {install(app) {console.log([✔] 自定义指令插件 install 触发了!);Object.entries(directives).forEach(([key, directive]) > {app.directive(…...

杰弗里·辛顿:深度学习教父

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 杰弗里辛顿:当坚持遇见突破,AI迎来新纪元 一、人物简介 杰弗…...

STM32蓝牙连接Android实现云端数据通信(电机控制-开源)

引言 基于 STM32F103C8T6 最小系统板完成电机控制。这个小项目采用 HAL 库方法实现,通过 CubeMAX 配置相关引脚,步进电机使用 28BYJ-48 (四相五线式步进电机),程序通过蓝牙连接手机 APP 端进行数据收发, OL…...

第一个Qt开发的OpenCV程序

OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 下载安装Qt:https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下载安装OpenCV:https://opencv.org/releases/ 下载安装CMake:Downl…...

如何编写爬取网络上的视频文件

网络爬虫程序,可以爬取某些网站上的视频,音频,图片或其它文件,然后保存到本地电脑上; 有时在工作中非常有用,那在技术上如何进行爬取文件和保存到本地呢?下面以python语言为例,讲解p…...

TCP 如何在网络 “江湖” 立威建交?

一、特点: (一)面向连接 在进行数据传输之前,TCP 需要在发送方和接收方之间建立一条逻辑连接。这一过程类似于打电话,双方在通话前需要先拨号建立连接。建立连接的过程通过三次握手来完成,确保通信双方都…...

【小白训练日记——2025/4/15】

变化检测常用的性能指标 变化检测(Change Detection)的性能评估依赖于多种指标,每种指标从不同角度衡量模型的准确性。以下是常用的性能指标及其含义: 1. 混淆矩阵(Confusion Matrix) 定义:统…...

交叉熵在机器学习中的应用解析

文章目录 核心概念香农信息量(自信息)熵(Entropy)KL散度(Kullback-Leibler Divergence)交叉熵 在机器学习中的应用作为损失函数对于二分类(Binary Classification):对于多…...

ARM Cortex汇编指令

在ARM架构的MCU开发中,汇编指令集是底层编程的核心。以下是针对Cortex-M系列(如M0/M3/M4/M7/M85)的指令集体系、分类及查询方法的详细说明: 一、指令集体系与核心差异 1. 架构版本与指令集特性 处理器架构指令集特点典型应用场…...

数据结构——二叉树(中)

接上一篇,上一篇主要讲解了关于二叉树的基本知识,也是为了接下来讲解关于堆结构和链式二叉树结构打基础,其实无论是堆结构还是链式二叉树结构,都是二叉树的存储结构,那么今天这一篇主要讲解关于堆结构的实现与应用 堆…...

InnoDB的MVCC实现原理?MVCC如何实现不同事务隔离级别?MVCC优缺点?

概念 InnoDB的MVCC(Multi-Version Concurrency Control)即多版本并发控制,是一种用于处理并发事务的机制。它通过保存数据在不同时间点的多个版本,让不同事务在同一时刻可以看到不同版本的数据,以此来减少锁竞争&…...

UDP目标IP不存在时的发送行为分析

当网络程序使用UDP协议发送数据时,如果目标IP不存在,发送程序的行为取决于网络环境和操作系统的处理机制。以下是详细分析: 1. UDP的无连接特性 UDP是无连接的传输协议,发送方不会预先建立连接,也不会收到对方是否存在…...

WHAT - 动态导入模块遇到版本更新解决方案

文章目录 一、动态导入模块二、常见原因与解决方案1. 模块 URL 错误2. 开发人员发版用户停留在旧页面问题背景解决方案思路1. 监听错误,提示用户刷新2. 使用缓存控制策略:强制刷新3. 动态模块加载失败时兜底4. 使用 import.meta.glob() 或 webpack 的 __…...

02-MySQL 面试题-mk

文章目录 1.mysql 有哪些存储引擎、区别是什么?1.如何定位慢查询?2.SQL语句执行很慢,如何分析?3.索引概念以及索引底层的数据结构4.什么是聚簇索引什么是非聚簇索引?5.知道什么叫覆盖索引嘛 ?6.索引创建原则有哪些?7.什么情况下索引会失效 ?8.谈一谈你对sql的优化的经验…...

#include<bits/stdc++.h>

#include<bits/stdc.h> 是 C 中一个特殊的头文件&#xff0c;其作用如下&#xff1a; 核心作用 ​​包含所有标准库头文件​​ 该头文件会自动引入 C 标准库中的几乎全部头文件&#xff08;如 <iostream>、<vector>、<algorithm> 等&#xff09;&…...

PostgreSQL:逻辑复制与物理复制

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…...

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414

在企业级部署中如何优化NVIDIA GPU和容器环境配置&#xff1a;最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展&#xff0c;企业对GPU加速计算的需求愈加迫切。在此过程中&#xff0c;如何高效地配置宿主机与容器化环境&#xff0c;特别是利用NVIDIA GPU和相关工具&…...

iphone各个机型尺寸

以下是苹果&#xff08;Apple&#xff09;历代 iPhone 机型 的屏幕尺寸、分辨率及其他关键参数汇总&#xff08;截至 2023年10月&#xff0c;数据基于官方发布信息&#xff09;&#xff1a; 一、标准屏 iPhone&#xff08;非Pro系列&#xff09; 机型屏幕尺寸&#xff08;英寸…...

栈的学习笔记

使用数组实现一个栈 #include <stdio.h>#define MAX_SIZE 101int A[MAX_SIZE]; int top -1; //栈顶指针&#xff0c;初始为-1&#xff0c;表示栈为空 void push(int x) {if (top MAX_SIZE - 1){printf("栈已满&#xff0c;无法入栈\n");return;}A[top] x;…...

Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。

目录 一. 打印日志的常见三种方法&#xff1f; 1.1 手动创建 Logger 对象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用频率较低&#xff09; 二. 常见的 Logger&#xff0c;logger&#xff0c;…...

按键精灵安卓/ios脚本辅助工具开发教程:如何把界面配置保存到服务器

在使用按键精灵工具辅助的时候&#xff0c;多配置的情况下&#xff0c;如果保存现有的配置&#xff0c;并且读取&#xff0c;尤其是游戏中多种任务并行情况下&#xff0c;更是需要界面进行保存&#xff0c;简单分享来自紫猫插件的配置保存服务器写法。 界面例子&#xff1a; …...