【MySQL】多版本并发控制

news2024/11/17 12:48:56

一、什么是MVCC

  MVCC是通过数据行的多个版本管理来实现数据库的并发控制。MVCC也就相当于是如何实现在相应的隔离级别下,更好的实现并发。

二、快照读与当前写

  MVCC在InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突

2.1、快照读

  快照读,读取的是快照数据。不加锁的简单SELECT都属于快照读。

SELECT * FROM player WHERE ...

  快照读是基于提高并发性能的考虑,实现是基于MVCC,在很多情况下避免了加锁操作,降低了开销。

2.2、当前读

  当前读读取的是记录的最新版本。加锁的场景下对数据进行增删查改都会进行当前读。

三、MVCC实现原理之ReadView

  ReadView的实现依赖于:隐藏字段、Undo Log、Read View

3.1、什么是ReadView

  ReadView就是事务在使用MVCC机制进行快照读操作时产生的读视图。InnoDB为每个事务构造一个数组用来记录并维护系统当前活跃事务的ID。(活跃指的是启动了但没有提交)

3.2、ReadView结构

  ReadView中包含四个重要的内容:

  • creator_trx_id:创建这个Read View的事务ID
  • trx_ids:生成ReadView时当前系统中活跃的读写事务的事务id列表
  • up_limit_id:活跃的事务中最小的事务ID
  • low_limit_id:系统中最大的事务ID(区别于最大的活跃事务ID)

例子:
在这里插入图片描述
trx_ids为trx2、trx3、trx5、trx8的集合,此时low_limit_id为trx8+1,up_limit_id为trx2

3.3、设计思路

  在四个隔离级别中,读未提交和串行化这两个隔离级别不需要MVCC。原因在于:

  • 读未提交,可以读取未提交事务修改过的数据。所以可以直接读取最新的数据,不需要去读历史版本的数据。
  • 串行化,InnoDB规定使用加锁的方式来访问记录,这直接解决了幻读的问题,所以不需要使用MVCC。

  而使用读已提交和不可重复读的隔离级别下,都必须保证读到已经提交了的事务修改过的数据,所以不能直接读取最新版本的记录。所以在ReadView中的主要任务就是判断版本链中哪个版本是当前事务可见的。

3.4、MVCC操作流程

  在查询一条记录的时候,流程如下:

  • 1、首先获取事务自己的版本号。
  • 2、获取ReadView
  • 3、进行查询,然后与ReadView中的事务版本号进行对比。
  • 4、如果不符合ReadView规则,则从Undo Log中获取历史快照。
  • 5、最后返回符合规则的数据

  如果版本链的最后一个版本也不符合规则,则查询结果不包含该数据。

3.5、ReadView规则

  • 如果被访问版本的trx_idx = ReadView的creator_trx_id:当前事务在访问它自己修改过的数据,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_idx < ReadView的up_limit_id:生成该版本的事务已经在当前事务之前提交了,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_idx >= ReadView的low_limit_id:生成该版本的事务已经在当前事务生成Readview后才开启,所以该版本不可以被当前事务访问。
  • 如果ReadView的up_limit_id <= 被访问版本的trx_idx <= ReadView的low_limit_id:判断trx_id是否在trx_ids链表中:
    • 如果在,表示生成该版本的事务仍然活跃,该版本不可访问
    • 如果不在,表示生成该版本的事务已经提交,该版本可以访问。

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

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

相关文章

软件应用实例,租赁系统软件操作教程,脚手架租赁管理集装箱租赁管理系统教程

软件应用实例&#xff0c;租赁系统软件操作教程&#xff0c;脚手架租赁管理集装箱租赁管理系统教程 一、前言 以下软件操作教程以&#xff0c;佳易王租赁管理系统软件V17.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件可以记录&#x…

MySQL索引优化实战宝典

MySQL索引是MySQL数据库用于快速查找和访问数据的一种数据结构&#xff0c;它就像书的目录一样&#xff0c;可以帮助数据库系统更快地定位到所需数据的位置&#xff0c;从而大大提高查询性能。 下面来看一下索引分类 一、索引分类 本文介绍平时使用最多的基于 InnnoDB…

盘点4款最适合教学的电路仿真软件

在现代电子教育中&#xff0c;电路仿真软件扮演着至关重要的角色。它们不仅能够帮助学生更好地理解电子电路原理&#xff0c;还能够提升教学效率&#xff0c;培养学生的实践能力。本文将盘点4款最适合教学的电路仿真软件&#xff0c;助您选择最佳的教学利器&#xff0c;同时介绍…

HTTP的三次握手和四次挥手? 我都给你讲清楚 !!!

今天我们来聊聊一个计算机网络中非常基础但又非常重要的概念——HTTP的三次握手和四次挥手。 一、三次握手 首先&#xff0c;我们来聊聊三次握手。三次握手其实是TCP&#xff08;传输控制协议&#xff09;建立连接时的一个过程&#xff0c;而HTTP是基于TCP的&#xff0c;所以我…

centos 环境部署

一、安装redis 1. 升级 GCC 最直接的解决方式是升级你的 GCC 编译器到支持 C11 标准的版本。CentOS 7 默认的 GCC 版本较旧&#xff0c;可能不支持 _Atomic。你可以通过以下步骤升级 GCC&#xff1a; 启用 CentOS 的 Software Collections (SCL) 仓库&#xff0c;该仓库提供了…

学习使用xbox手柄控制小乌龟节点移动

使用xbox手柄控制小乌龟&#xff0c;首先要下载joy功能包&#xff0c;发布sensor_msgs话题也就是手柄和ros通信的话题。 下载的步骤就根据官方文档即可 joy/Tutorials/ConfiguringALinuxJoystick - ROS Wiki 这里我提供一下具体步骤 第一步 安装joy 首先安装对应系统版本的…

Oracle VM(虚拟机)性能监控工具

Oracle VM是一个独立的虚拟化环境&#xff0c;由 Oracle 提供支持和设计&#xff0c;旨在为运行虚拟机提供轻量级、安全的基于服务器的平台。Oracle VM 能够在受支持的虚拟化环境中部署操作系统和应用软件&#xff0c;Oracle VM 将用户和管理员与底层虚拟化技术隔离开来&#x…

Java Web-Tomcat

Web服务器 Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”。 Tomcat&#xff0c;是一个 HTTP 服务器。我们只需要在服务器中安装一个Web服务器如Tomcat&#xff0c;然后就可以将…

vue项目使用eletron将打包成桌面应用(.exe)

vue项目使用eletron将打包成桌面应用(.exe) 1.前期准备 两个项目&#xff1a; 1、自己用vue cli创建的项目 2、第二个是去gitee将案例clone下来 案例地址 https://gitee.com/qingplus/electron-quick-start.git 2、测试案例是否可以正常运行 # 进入项目 cd electron-quick-…

考研数学|《1800》《1000》《880》《660》最佳搭配使用方法

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…

TinyEMU源码分析之启动流程

TinyEMU源码分析之启动流程 1 始于0x10002 确定BBL入口点3 mentry.S执行过程4 启动流程小结 本文属于《 TinyEMU模拟器基础系列教程》之一&#xff0c;欢迎查看其它文章。 本文中使用的代码&#xff0c;均为伪代码&#xff0c;删除了部分源码。 1 始于0x1000 我们沿着TinyEMU…

夜晚水闸3D可视化:科技魔法点亮水利新纪元

在宁静的夜晚&#xff0c;当城市的霓虹灯逐渐暗淡&#xff0c;你是否曾想过&#xff0c;那些默默守护着城市安全的水闸&#xff0c;在科技的魔力下&#xff0c;正焕发出别样的光彩&#xff1f;今天&#xff0c;就让我们一起走进夜晚水闸3D模型&#xff0c;感受科技为水利带来的…

AI足球教练上岗利物浦,射门机会提高13%!来自DeepMind,网友:这不公平

梦晨 发自 凹非寺 量子位 | 公众号 QbitAI AI足球教练登上Nature子刊&#xff0c;谷歌DeepMind与利物浦队合作三年打造&#xff1a; 如同AlphaGo颠覆围棋一样&#xff0c;改变了球队制定战术的方式。 像是进攻方把球传给谁更容易创造射门机会&#xff0c;防守方如何调整布阵……

【双指针】Leetcode 四数之和

题目解析 18. 四数之和 这道题的思路和三数之和的思路相同&#xff0c;都是固定一个数&#xff0c;然后在剩下的区间中寻找和为目标值的元组&#xff0c;其次最重要的是要进行去重 算法讲解 1. 完成排序 2. 固定一个数&#xff0c;求剩下区间中三元组的和等于 target - nums[…

用易查分制作承诺书签订,在线手写签名,一键导出打印

假期将至&#xff0c;为积极落实安全管理规定&#xff0c;单位通常需要下发安全承诺书进行签字确认。 易查分可以实现网上下发安全承诺书通知&#xff0c;让查询者进行签名确认&#xff0c;还可以生成PDF&#xff0c;方便打印一人一张的纸质版承诺书&#xff0c;本次就来介绍如…

flask各种版本的项目,终端命令运行方式的实现

目录 写在前面 一、Flask项目的基本结构 二、使用终端命令运行Flask项目 1. 安装Flask 2. 创建Flask应用 3. 配置FLASK_APP环境变量 4. 运行Flask应用 5. 访问Flask应用 三、Flask CLI的其他功能 1. 创建Flask应用 2. 运行开发服务器 3. 清理缓存文件 4. 运行单元…

补题集合2

VJ 409组队赛2 C - Find a Number 没想到这是一个签到题&#xff0c;因为数据量小&#xff0c;状态并不多&#xff0c;所以可以使用 b f s bfs bfs 去跑每一个状态。令 m o d mod mod 是余数&#xff0c; s u m sum sum 是累加和&#xff0c;那么状态最多就只有 500 ∗ 5…

微信小程序的页面交互1

一、page&#xff08;&#xff09;函数 每个页面的s代码全部写入对应的js文件的page&#xff08;&#xff09;函数里面。点击编译&#xff0c;就可以显示js代码的运行效果。注意&#xff0c;每个页面的page&#xff08;&#xff09;函数是唯一的。 page&#xff08;&#xff…

Oracle参数文件详解

1、参数文件的作用 参数文件用于存放实例所需要的初始化参数&#xff0c;因为多数初始化参数都具有默认值&#xff0c;所以参数文件实际存放了非默认的初始化参数。 2、参数文件类型 1&#xff09;服务端参数文件&#xff0c;又称为 spfile 二进制的文件&#xff0c;命名规则…

【CSDN活动】程序员职业生涯的分水岭:年龄还是经验?

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 程序员职业生涯的分水岭&#xff1a;年龄还是经验&#xff1f;引言技术更新换代…