首页 > 数据库 >Mysql如何实现原子性(MVCC实现原理)

Mysql如何实现原子性(MVCC实现原理)

时间:2024-12-03 11:57:09浏览次数:6  
标签:事务 快照 log 实现 Mysql undo readview 版本 MVCC

Mysql如何实现原子性(MVCC实现原理)

Mysql实现原子性主要通过一下机制

  1. MVCC多版本并发控制

MVCC的实现原理

在介绍MVCC的实现原理之前需要先介绍一下Mysql表中的隐藏字段 , 以及undo_log版本链以及readview

1. Mysql中的隐藏字段

Mysql在创建表的时候除了我们所定义的字段还定义了一下三个字段

  1. DB_TEX_ID --> 同来记录当前事务ID , 该字段是一个自增的Int , 每当事务开启后 , 就会对该ID自增
  2. DB_ROLL_TRX --> 该字段是记录上一个undo_log日志的地址
  3. DB_ROW_ID --> 当用户未指定主键时 , 该字段会作为主键

2. 什么是undo_log版本链

在事务执行增删改之前 , 会在undo_log日志当中记录当前的数据信息 , 并保存DB_TROLL_TAX记录上一个undo_log日志地址

如下图所示 , 我们开启了四个事务 , 对于每个事务的版本号为2 , 3 , 4 ,5

在这里插入图片描述

那么在事务的创建过程中就会在undo_log日志当中注册版本信息 , 如下图

在这里插入图片描述

那么当上述的事务都注册完毕就会形成一个版本链

在这里插入图片描述

3. 什么是readview

readview就是通过一定的机制来判断 , 当前版本的事务是否可以被读取 , 也就是说是快照读 sql执行的依据

当前读:

当前读就是记录最新版本的数据 , 在读取过程中会加锁

快照读

就是简单的select语句 , 在读取过程中不加锁 是非阻塞的 , 读取的数据有可能是当前数据 ,也有可能是历史数据

而对于快照读所读取的数据是什么也就是通过readview一下几点来实现的

首先在readview中保存了下列字段 , 分别用来记录当前并发日志的信息 , 通过该消息与一定的规则来实现快照读

在这里插入图片描述

规则如下

在这里插入图片描述

4. MVCC是如何基于readview, undo_log版本链与隐藏字段实现快照读

还是针对下述事务 , 我们来判断一下事务无的;i两次快照读分别命中了那个版本的数据

在这里插入图片描述

首先我们来分析第一次查询

在这里插入图片描述

m_ids: { 3 , 4 , 5}

min_trx_id: 3

max_trx_id : 6

creator_trx_id : 5

分析完readview后我们就要从undo_log版本链进行比对

在这里插入图片描述

在这里插入图片描述

可以看出来对于第一个查询命中的事务2 , 对于第二个查询命中的是事务3

介绍完隐藏字段 , undo_log日志链与readview这三个概念后, 对于MVCC要做什么怎么做应该有了一个大致的了解

MVCC多版本并发控制也就是在多个事务并发的情况下 , 通过readview判断快照读命中的是哪个语句 , 进而获取查询信息

=============================================================

面试官:事务中的隔离性是如何保证的呢?(你解释一下MVCC)

候选人:事务的隔离性是由锁和mvcc实现的。

其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段,第二个是undo log日志,第三个是readView读视图

隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回滚指针),指向上一个版本的事务版本记录地址

undo log主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表

readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生成ReadView,后续复用

标签:事务,快照,log,实现,Mysql,undo,readview,版本,MVCC
From: https://blog.csdn.net/xiugtt6141121/article/details/144211185

相关文章

  • html静态网站基于HTML+CSS+JavaScript上海美食介绍网站网页设计与实现共计5个页面
    ......
  • 2024最新苹果群控,手机实现多设备同步管理
    对苹果群控技术实现多设备同步管理的简要介绍。###一、核心原理-苹果群控技术的基础是硬件连接,使用USB数据线或无线网络(Wi-Fi)将多台苹果手机与控制电脑连接起来。-在控制电脑上安装专门的群控软件是实现远程控制的关键步骤。-群控软件通过特定的远程控制协议与苹果手......
  • 系统文件IO 例题 Linux环境 C语言实现
    问题:通过系统文件IO,实现文件拷贝功能。测试:文本  图片 视频代码:#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>#include<unistd.h>intmain(intargc,char*argv[]){if(argc<3){printf("a......
  • 电商企业转起数据飞轮,火山引擎助力商家实现“数据找人”
    “双12”即将来临,在竞争激烈的商业环境中,商家们已经不再关注宏大的“造节”,转而关注产品本质、关注数据带来的降本增效。近日,记者在与多位行业专家和商家交流中发现,各大平台都在积极探索帮助商家的新路径,其中,火山引擎凭借其提出的“数据飞轮”理念,正在成为越来越多商家企业数字化......
  • 聊聊如何利用kafka实现请求-响应模式
    前言在大多数场景中,我们经常使用kafka来做发布-订阅,在发布-订阅模型中,消息一旦发送就不再追踪后续处理,但在某些业务场景下,我们希望在发送消息后等待一个响应,然后根据这个响应来做我们后续的操作。在这种请求-响应模式,我们就可以利用springkafka的ReplyingKafkaTemplate来实现Re......
  • 全方位解析回文字符串的判断方法与实现
    回文字符串是一种特殊的字符串,其特点是正向和反向的读法完全相同。例如:“madam”和“level”是回文,而“hello”不是回文。本文将从简单到复杂,系统讲解多种判断回文字符串的方法,并提供对应的代码实现。一、什么是回文字符串?回文字符串的定义:字符串从左到右与从右到......
  • 基于SpringBoot实现的无人超市管理系统(代码+开题报告+答辩PPT+论文)
    ......
  • mySQL数据库自动完整备份 centos
    1#!/bin/bash2#远程地址3dbhost='localhost'4#端口5dbport='3308'6#需要备份的数据库,多个数据库用空格分开7dbnames=("db1""db2""db3""dd4dd5")8#用户名9username='root'10#密码11password=......
  • SpringBoot 驱动下基于 MVC 的高校行政事务管理系统:设计蓝图与实现路径
    1绪论1.1课题背景身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径[1]。纸质版的书籍比较沉重,携带不方便,而由于手机......
  • 基于 MVC 架构的 SpringBoot 高校办公室行政事务管理系统:创新设计与高效实现
    1绪论1.1课题背景身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径[1]。纸质版的书籍比较沉重,携带不方便,而由于手机......