MVCC是一种并发控制的方法,在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存

主要是为了提高数据库并发性能,更好的处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读

  • 当前读
    • select lock in share mode(共享锁),select for update;update,insert,delete(排他锁)
    • 读取的是记录的最新版本,读取时要保证其他事务不能修改当前记录,会对读取的记录进行加锁
  • 快照读
    • 不加锁的select操作就是快照读,即不加锁的非阻塞的
    • 前提是隔离级别不是串行级别,串行级别下的快照读回退化为当前读
    • 基于提高并发性能的考虑,快照读的实现是基于多版本并发控制
    • mvcc是行锁的一个变种,在很多情况下,避免可加锁操作,降低开销
    • 基于多版本,即快照读可能读到的并不一定是最新数据版本,可能是历史版本

MVCC多版本并发控制指“维持一个数据的多个版本,使得读写操作没有冲突”的概念

MySQL中快照读就是实现MVCC理想模型其中一个非阻塞读功能,相对而言,当前读就是悲观锁的具体功能实现

快照读本身也是抽象概念。MVCC模型在MySQL中实现由3个隐式字段:undo日志,read view等完成

优势

mvcc是用来解决读-写冲突的无锁并发控制,为事务分配单向长时间的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库快照

  • 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能
  • 同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题

MVCC+悲观锁:MVCC解决读写冲突,悲观锁解决写写冲突

MVCC+乐观锁:MVCC解决读写重读,乐观锁解决读写冲突

实现原理

Rollback Segments 用来临时保存当数据库发生改变时的先前值

  • 因某种原因或其他用户想要通过ROLLBACK声明取消一个数据操作,数据就会复原到之前改变时的值
    • 只在transaction过程中有效,用户执行COMMIT命令,Rollback Segment里面的值就会标识为失效的,数据改变为永久化
  • 当有并发session访问一个数据值改变但事务还没有提交的表
    • select语句开始读取一个表同时一个事务也在修改这个表值,修改前的值就保存到Rollback Segment中
    • select语句也是从Rollback Segment里读取表的值

隐式字段

  • DB_TRX_ID:6byte,最近修改(update/insert/delete)事务ID;记录创建/最后一次修改该记录的事务ID

  • DB_ROLL_PTR:7byte,回滚指针,指向这条记录的上一个版本(存储在rollback segment中)

  • DB_ROW_ID:6byte,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引

  • 实际还有一个删除flag隐藏字段,既记录被更新或删除并不代表真的删除,而是删除的flag改变(软删除字段)

img

undo日志

  • insert undo log
    • 代表事务在insert新纪录时产生的undo log
    • 只在事务回滚时需要
    • 在事务提交后立即丢弃
  • update undo log
    • 事务在进行update或delete时产生的undo log
    • 在事务回滚和快照读时需要
    • 不能随便删除,只有在快照读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一删除

purge

  • 实现InnoDB的MVCC机制,更新或删除操作都只是设置老记录的deleted_bit,不是真正将过时的记录删除
    • deleted_bit是一个标志位
    • 当执行删除操作时,并不是将记录从数据页中物理删除,而是将deleted_bit设为1,表示记录被删除
    • 更新操作,会创建一个新的记录版本,并将旧记录的deleted_bit设为1,时旧记录类似删除,新纪录包含更新后数据
  • 节省磁盘空间,有purge线程来清理deleted_bit为true的记录,同时该线程自己维护一个read view
    • 当记录为true并DB_TRX_ID相对purge线程的read view可见,那么记录被安全清除
    • InnoDB中垃圾回收机制,当确认没有事务需要访问deleted_bit为1记录时,才被物理删除

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

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

相关文章

Redis源码安装 Failed to configure LOCALE for invalid locale name 报错解决

源码安装之后 报错 Failed to configure LOCALE for invalid locale name原因是redis 8.0 需要配置字符集 只需要在环境变量中添加 LANGen_US.utf8 即可, 在配置之前先查看当前系统中存在哪些字符集 locale -a然后在 /etc/profile 环境变量中添加配置 LANGen_US.ut…

跑酷小游戏2.0

emm&#xff0c;下面是1.0版本的&#xff0c;我问了下AI&#xff0c;出了第四关&#xff0c;按步骤更新吧。其实是我也搞不懂AI在说啥//跑酷游戏C版 #include<bits/stdc.h> #include<windows.h> #include<stdio.h> #include<conio.h> #include<tim…

相比于传统的全波分析,特征模分析具有哪些优点

相比传统的全波分析&#xff08;Full-Wave Analysis&#xff0c;直接求解电场/电流分布&#xff09;&#xff0c;特征模分析&#xff08;Characteristic Mode Analysis&#xff0c;CMA&#xff09;的优点主要体现在物理可解释性、设计指导性和计算效率三个方面。1. 物理机理更清…

UE材质World Position 和 Object Position

Object Position 是 物体原点在世界坐标系下的位置 World Position 是 物体上的这个点 在世界坐标系下的位置 Actor Position 是 物体轴点位置 WorldPosition - ObjectPosition 是一个从物体原点&#xff08;pivot&#xff09;指向物体上该点的向量&#xff08;方向&#x…

github上传文件

git remote add origin https://github.com/Ineedstrong/socket-practice.git如果不行的情况下git remote set-url origin gitgithub.com:Ineedstrong/socket-practice.git就以这种方式3. 使用 SSH 替代 HTTPS&#xff08;推荐&#xff09;绕过 HTTPS 的 TLS 问题&#xff1a;生…

【STM32U385RG 测评】基于VSCode的STM32开发环境搭建

【STM32U385RG 测评】搭建基于VSCode的STM32开发环境 文章目录【STM32U385RG 测评】搭建基于VSCode的STM32开发环境一、安装软件1.1 安装VSCode1.2 安装STM32CubeMX1.3 安装STM32CubeCLT1.4 安装ST-MCU-FINDER-PC二、安装插件2.1 安装 STM32Cube for VSCode插件三、创建项目3.1…

设计模式(二)——策略模式

一、基本概念 既然你已经接触到了设计模式&#xff0c;那你大概率你写过类似这样的代码&#xff1a;根据不同的选择条件&#xff08;如排序、搜索或路由&#xff09;执行不同的代码逻辑。通常的解决方案是使用if-else或switch语句&#xff0c;但这些条件判断有一个最大的问题是…

MySQL基础知识总结

一、MySQL简述 数据库 是一个有组织的集合&#xff0c;用于存储和管理数据的系统。它是一个软件系统&#xff0c;被设计用来存储、检索和管理数据&#xff0c;并提供数据的快速访问和处理。数据库可以被看作是一种特殊的文件系统&#xff0c;但与传统的文件系统不同的是&#…

数据仓库命名规范

1. 概述 数据模型是数据管理的分析工具和交流的有力手段&#xff1b;同时&#xff0c;还能够很好地保证数据的一致性&#xff0c;是实现商务智能&#xff08;Business Intelligence&#xff09;的重要基础。因此建立、管理一个企业级的数据模型&#xff0c;应该遵循标准的命名…

FlinkSQL Joins全解析

1. Lookup Join用途&#xff1a;用于流表与外部维表&#xff08;静态或缓慢变化表&#xff09;的关联&#xff08;如 MySQL、HBase 等&#xff09;。特点&#xff1a;通过 实时查询外部存储 获取维度数据。仅支持 处理时间&#xff08;Processing Time&#xff09;语义&#xf…

【FileZilla】基于 FTP 的 Windows 和 Linux 文件传输

在嵌入式开发过程中我们经常需要在 Windows 和 Linux 下进行文件传输&#xff0c;本文就介绍一种通过 FTP 实现 Windows 和 Linux 文件传输的方法。 Windows 为物理主机&#xff0c;Linux 是在 Vmware 虚拟机中安装运行的 Ubuntu&#xff0c;版本为 18.04。 Ubuntu 安装 FTP …

【GPT入门】第42课 ollama安装与运行llama3模型

【GPT入门】第42课 ollama安装与运行llama3模型1. 安装ollama2.运行模型3.测试模型3.1 直接在命令行交互3.2 openai接口1. 安装ollama https://ollama.com/ 选download, 选linux 执行安装命令&#xff1a; curl -fsSL https://ollama.com/install.sh | sh2.运行模型 启动服…

Lua语言元表、协同程序

元表元表的定义允许我们改变table的行为。setmetatable(普通表&#xff0c;元表)-- 元表a {"a","b","c"} -- 普通表 b {} --元表c setmetatable(a,b)print("------------------------")f {}print("f:",f)d setmetatabl…

[已解决]VSCode右键菜单消失恢复

前言 莫名其妙,好似VSCode自动更新以后,右键菜单就失效了,重装也无果. 手动搞一个吧 保存下面代码到桌面修复VSCODE右键菜单.reg,双击运行即可. Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode]"使用 VSCode 打开""…

什么是浏览器标识?

浏览器标识 层面一&#xff1a;网络层指纹 (HTTP/TLS) 这是最基础的指纹&#xff0c;即使不用浏览器&#xff0c;只用Go的 net/http 发请求也会留下。HTTP Headers (请求头): User-Agent: 最著名的标识&#xff0c;声明自己是什么浏览器。很容易伪造&#xff0c;但也很容易被识…

五十八、【Linux系统nginx服务】nginx代理服务器、nginx优化

Nginx代理技术全景图 #mermaid-svg-0dRktnHYPXypO9xB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0dRktnHYPXypO9xB .error-icon{fill:#552222;}#mermaid-svg-0dRktnHYPXypO9xB .error-text{fill:#552222;stroke…

[0CTF 2016]piapiapia

usernamepassword回显推断admin123Invalid user name or passwordadmin123Invalid user name or passwordadmin123Invalid user name or passworda123Invalid user name说明username是adminadmin1Invalid password这很奇怪了admin0200&#xff1f;admin11Invalid user name or …

人工智能系列(7)人工神经网络中的无监督学习

一. 无监督学习简介神经网络的一个关键属性是能够从环境中学习&#xff0c;并在不断学习的过程中持续改善性能。在无监督学习&#xff08;又称自组织学习&#xff0c;self-organized learning&#xff09;中&#xff0c;网络无需外部教师提供目标输出&#xff0c;而是通过对输入…

250810-OpenWebUI集成Dify应用

A. 最终效果 B. 环境配置 配置并启动Open-WebUI 随后浏览器访问&#xff1a;http://localhost:8080 pip install open-webui open-webui serve配置并启动Pipelines Pipelines默认占用80端口相比于Docker的启动方式&#xff0c;可以在相同的命令行中&#xff0c;查看pipelines …

day22|学习前端ts语言

抽象类&#xff0c;继承。不能创造实例class类&#xff1a;属性声明&#xff0c;构造器&#xff0c;方法&#xff0c;实例继承super&#xff08;&#xff09;override重写父类继承的方法声明提升&#xff08;hoisting&#xff09;同一个js作用域内部&#xff0c;编译阶段把函数…