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

mysql-分析MVCC原理

一、MVCC简介

MVCC是一种用来解决读写冲读的无锁并发控制,也就是为事务分配单增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照,所以MVCC可以为数据库解决一些问题。

二、数据并发场景

  1. 读读:不存在任何问题,也不需要并发控制。
  2. 读写:有线程安全问题,kennel会造成事务隔离性问题,可能遇到脏读、幻读、不可重复读。
  3. 写写:有线程安全问题,可能存在更新丢失问题。mysql-分析并解决mvcc更新丢失问题

三、MySQL事务隔离级别

在这里插入图片描述

四、MVCC能解决的问题

  1. 在并发读写数据库是, 可以做到在读操作时,不用阻塞写操作;在写操作时,不用阻塞读操作,提高数据库并发读写性能。快照读不触发间隙锁。
  2. 解决脏读、幻读、不可重复读等事务隔离问题,但不能解决更新丢失问题。

五、 当前读和快照读的区别

当前读
它读取的数据记录都是当前最新的版本,会对当前读区的数据进行加锁,防止其他事务修改数据,是被关锁的一种操作。
如下操作都是当前读:

  • select lock in share mode(共享锁) 行锁级别
  • select for update(排他锁) 行锁级别
  • update(排他锁)
  • insert(排他锁)
  • delete(排他锁)
  • 串行化事务隔离级别(排他锁)

快照读

快照读实现基于多版本并发控制即MVCC,既然是多版本那么快照读读到的数据不一定是当前最新的数据,有可能是之前历史版本的数据。
如下操作是快照读:

  • 不加锁的select操作(注:事务级别不是串行化)
    读已提交和重复读他们的快照都是基于MVCC实现的,MVCC常见的概念:undolog、版本链、readview。

版本链:
在这里插入图片描述
readview:
作用:让你知道在版本链里选择哪些记录。
涉及的字段
m_ids:表示生成readview时当前系统中活跃(未提交)的时读写事务的id。
min_trx_id:表示生成readview时当前系统中活跃的读写事务中最小的事务id。
max_trx_id:表示生成readview时系统应该分配给下一个事务的id。
creator_trx_id:表示生成该readview的事务id。
readview如何判断版本链中的哪些版本可用:

  • trx_id==creator_trx_id:可以访问这个版本。
  • trx_id < min_trx_id:可以访问这个版本。
  • trx_id > max_trx_id:不可以访问这个版本。
  • min_trx_id <= trx_id <= max_trx_id: 如果trx_id在m_ids中时不可以访问这个版本的,反之可以。

六、读已提交和可重复读生成review的时机

读已提交和可重复读生成的时机不同。
读已提交事务每次执行select查询的时候都会生成一个新的readview,他是以每个select执行语句为单位的。比如开启事务,在事务中执行两次select查询,这两个查询会生成两个readview,每个select查询对应一个readview,也是没有实现可重复读的一个原因。
可重复读生成readview是以一个事务为单位,同一个事务中执行多次select只会生成一个readview。可重复读无法解决删除幻读,但可以解决插入幻读,若想解决删除幻读可以开启间隙锁。mysql-分析并解决可重复读隔离级别发生的删除幻读问题

七、幻读在不同书中的不同定义

在《数据库系统概念》第五版-王珊、萨师煊著,这样定义的:

  1. 事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读区数据时,发现某些记录神秘消失了。
  2. 事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读区数据时,发现多了一些记录。

这两种不可重复读有时也被称为幻影现象(幻读)。

在《mysql王者晋升之路》-张甦著,这样定义的:

  1. 不可重复读是指在其中一个事务中,读取到了其他事务针对旧数据的修改记录(常见的操作就是update或者delete语句)。这里也可以说明作者是将删除归于不可重复读而不是幻读。
  2. 幻读是指在其中一个事务中,读取到了其他事务新增的数据,仿佛出现了幻影现象(常见操作就是Insert语句),这种读的现象允许出现在读已提交的事务隔离级别中。

这两本书,对幻读的定义有歧义,第一本书是将删除和插入都归于幻读,第二本书之将插入归于幻读。本文章是基于第一本书。

相关文章:

mysql-分析MVCC原理

一、MVCC简介 MVCC是一种用来解决读写冲读的无锁并发控制&#xff0c;也就是为事务分配单增长的时间戳&#xff0c;为每个修改保存一个版本&#xff0c;版本与事务时间戳关联&#xff0c;读操作只读该事务开始前的数据库的快照&#xff0c;所以MVCC可以为数据库解决一些问题。…...

由于答案过大,请对a取模。取模后的答案不是原问题的答案 取模有何意义呢 详解

在许多情况下&#xff0c;处理大数时会将 a 取模&#xff0c;即用 a m o d m a \mod m amodm的结果代替 a a a&#xff0c;然后继续计算。这种做法的核心问题是&#xff1a;取模后的值与原问题之间的关系是否保持一致。取模后的意义在于&#xff0c;它在不改变问题核心特性的前…...

【c++篇】掌握动态内存的奥妙

【C篇】动态内存 一、Static 关键字1.1函数内部的静态变量1.2 全局静态变量1.3静态成员变量1.4静态成员函数 二、内存管理2.1栈区(Stack)2.2堆区&#xff08;Heap&#xff09; 三、动态内存分配机制3.1、动态内存分配的两种方法c语言c 3.2new 和delete的用法3.3语法和类型安全性…...

5.4.2-3 编写Java程序读取HDFS文件

在本次实战中&#xff0c;我们通过Java程序实现了从Hadoop分布式文件系统&#xff08;HDFS&#xff09;读取文件的功能。首先&#xff0c;我们创建了ReadFileOnHDFS类&#xff0c;并在其中实现了两个方法&#xff1a;read1()和read1_()。read1()方法展示了如何打开HDFS文件并逐…...

@EnableConfigurationProperties @ConfigurationProperties

EnableConfigurationProperties && ConfigurationProperties的使用时机 今天在写properties时想到了这个问题&#xff0c;为什么有时候我需要写EnableConfigurationProperties有时候又不需要呢&#xff1f;下面就详细讲讲。 Data Component ConfigurationProperties(pr…...

RK3588适配MTK7921 USB接口WiFi驱动开发

在当前RK原厂提供的SDK里面已经适配的WiFi模组有不少,但是支持的模组大部分集中在realtek、正基、英飞凌等厂家。主要型号有Realtek的RTL8188系列、RTL8723系列、RTL8812系列、RTL8821系列、RTL8822系列和支持WiFi 6 的RTL8852系列,正基的AP6275系列、AP6276系列等。接下来将…...

【数据结构OJ】【图论】图综合练习--拓扑排序

题目描述 已知有向图&#xff0c;顶点从0开始编号&#xff0c;求它的求拓扑有序序列。 拓扑排序算法&#xff1a;给出有向图邻接矩阵 1.逐列扫描矩阵&#xff0c;找出入度为0且编号最小的顶点v 2.输出v&#xff0c;并标识v已访问 3.把矩阵第v行全清0 重复上述步骤&#xff0…...

模型 I/O 与 LangChain 实践

模型 I/O 与 LangChain 实践 本文是《LangChain 实战课》第 4 节——模型 I/O&#xff1a;输入提示、调用模型、解析输出的一些学习笔记与总结。这篇文章将围绕模型 I/O 的基本概念、LangChain 提供的最佳实践以及如何通过 LangChain 实现高效的结构化数据处理展开。 什么是模…...

C++:用红黑树封装map与set-1

文章目录 前言一、STL源码分析二、红黑树的构建三、map与set整体框架的搭建与解析四、如何取出进行比较&#xff1f;1. met与set的数据是不同的2. 取出数据进行比较1&#xff09;问题发现2&#xff09;仿函数解决 五、封装插入六、迭代器的实现1. operator* 与operator->2. …...

HBU算法设计与分析 贪心算法

1.最优会场调度 #include <bits/stdc.h> using namespace std; const int N1e55; typedef pair<int,int> PII; PII p[N]; priority_queue<int,vector<int>,greater<int>> q; //最小堆 存储最早结束的会场的结束时间 int n; //其实这个题可以理…...

python pycharm安装教程及基本使用,超详细

一.PyCharm下载及安装 1.1 进入pycharm官网&#xff0c;点击下载,下载社区版本&#xff08;日常学习使用够用了&#xff09;&#xff0c;专业版是收费的哦&#xff08;功能更强大&#xff09; Download PyCharm: The Python IDE for data science and web development by Jet…...

变量提升函数提升

示例 1&#xff1a;变量提升 原始代码&#xff1a; console.log(x); // 输出: undefined var x 5; console.log(x); // 输出: 5提升后的代码&#xff08;理解为&#xff09;&#xff1a; var x; // 变量声明被提升 console.log(x); // 输出: undefined x 5; // 赋值 conso…...

el-table vue3统计计算数字

固定合计在最下列 父组件 <template><el-tablev-loading"loading"tooltip-effect"light":data"list"style"width: 100%":max-height"maxHeight"element-loading-text"拼命加载中...":header-cell-styl…...

IDE应当具备的功能

IDE 是辅助编程的工具&#xff0c;应当具备以下功能 语法高亮 显示注释 显示光键词 显示括号 matlab 自带的 IDE 没有这个功能 显示缩进 matlab 自带的 IDE 没有这个功能 显示字符串 显示数字常量 定位到函数的定义位置 Matlab 自带的集成开发环境&#xff08;IDE&am…...

Stable Diffusion初步见解(二)

Stable Diffusion 是一种先进的深度学习模型&#xff0c;用于生成高质量的图像和艺术作品。它基于扩散模型&#xff08;Diffusion Models&#xff09;&#xff0c;并结合了潜在扩散模型&#xff08;Latent Diffusion Models&#xff09;以及条件生成技术&#xff08;如文本到图…...

前端框架 react 性能优化

目录 一、不使用任何性能优化API进行优化 二、通过性能优化API优化 1、React.memo 2、useCallback 3、useMemo 4、PureComponent 三、总结​ 总览&#xff1a;react的优化核心思想就是让react跳过重新渲染那个些没有改变的Component&#xff0c;而只重新渲染发生变化的C…...

RK3568平台开发系列讲解(Input子系统篇)输入子系统介绍

🚀返回专栏总目录 文章目录 一、什么是输入子系统?二、输入设备和节点的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 一、什么是输入子系统? 在 Linux 中,input 子系统是专门为处理输入类设备而设计的一个子系统或框架。它提供 了一套通用的接口和机制,用于驱…...

准备阶段 Profiler性能分析工具的使用(一)

Unity 性能分析器 (Unity Profiler) 性能分析器记录应用程序性能的多个方面并显示相关信息。使用此信息可以做出有关应用程序中可能需要优化的事项的明智决策&#xff0c;并确认所做的优化是否产生预期结果。 默认情况下&#xff0c;性能分析器记录并保留游戏的最后 300 帧&a…...

go-rod vs Selenium:自动化测试工具的比较与选择

自动化测试是软件开发过程中的关键环节&#xff0c;它能够帮助我们发现缺陷、验证功能并提高软件质量。随着Web技术的快速发展&#xff0c;市场上出现了多种自动化测试工具&#xff0c;其中Selenium和go-rod是两个备受关注的选择。本文将从多个维度对这两个工具进行比较&#x…...

探索免费的Figma中文版:开启高效设计之旅

在当今数字化设计的浪潮中&#xff0c;Figma以其强大的云端协作功能和出色的设计能力&#xff0c;成为了众多设计师的心头好。而对于国内的设计师来说&#xff0c;能够免费使用Figma中文版更是一大福音&#xff0c;下面就来一起探索一下吧。 一、Figma中文版的获取途径 虽然F…...

功能齐全,支持协作 | Docker部署一款支持多人共享的私密浏览器『n.eko』

功能齐全&#xff0c;支持协作 | Docker部署一款支持多人共享的私密浏览器『n.eko』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 玩NAS的朋友基本都会在本地部署一款浏览器用来远程访问内网的网络设备&#xff0c;或者偶尔拿来浏览一些私密网站都是很方便的。 今天为大家分享的…...

部署实战(二)--修改jar中的文件并重新打包成jar文件

一.jar文件 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中&#xff0c;多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…...

Ubuntu24.04——软件包系统已损坏

如果你在使用 Ubuntu 时遇到“软件包系统已损坏”的问题&#xff0c;可以尝试以下步骤来修复它&#xff1a; 更新软件包列表&#xff1a; 打开终端&#xff0c;运行以下命令以更新软件包列表&#xff1a; sudo apt update修复损坏的软件包&#xff1a; 运行以下命令来修复损坏的…...

2024年华为OD机试真题-空栈压数-C++-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述: 向一个空栈压入…...

嵌入式Linux基于IMX6ULL tslib学习总结

目录 1. tslib开源库介绍1.1 tslib主要功能1.2 架构 2. tslib代码简单分析2.1 ts_print_mt.c分析代码2.2 ts_setup代码分析2.3 ts_open代码分析2.4 ts_config代码分析2.5 ts_read_mt代码分析2.6 tslib中4个模块的含义 3. 使用tslib库打印触摸屏2点之间的距离 基于韦东山IMX6ULL…...

go中的参数传递是值传递还是引用传递?

在Go语言中&#xff0c;参数传递机制是一个重要的概念&#xff0c;它决定了函数内部对参数的修改是否会影响到原始数据。关于Go中的参数传递是值传递还是引用传递的问题&#xff0c;可以从以下几个方面进行解答。 一、值传递与引用传递的定义 值传递&#xff1a;在值传递中&a…...

记录一种在内核空间向用户空间通知中断的方法

记录一种在内核空间向用户空间通知中断的方法 0.前言1.代码实现1)内核设备驱动实现2)消息通知实现3)测试程序 2.解析 参考文章&#xff1a;Linux驱动实践&#xff1a;中断处理函数如何【发送信号】给应用层&#xff1f; 0.前言 最近在项目中遇到一个需求&#xff0c;需要将一个…...

.NetCore 过滤器和拦截器 的区别

Asp.NET Core 中的过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;是两个不同的概念&#xff0c;但它们在某些方面有相似之处&#xff0c;也有明显的区别。 &#x1f511;过滤器&#xff08;Filter&#xff09; 过滤器是Asp.NET Core中用于…...

【笔记】自动驾驶预测与决策规划_Part7_数据驱动的预测方法

文章目录 0. 前言1. 多模态传感器的编码方式1.1 栅格化表示1.2 向量化表示 Vectornet1.3 基于点云或者多模态输入的预测1.4 基于Transformer的方法 2. 网络输出的表达形式2.1 多模态轨迹回归2.2 轨迹分类2.3 轨迹回归轨迹分类2.4 目标点预测 3.场景级别的预测和决策3.1 论文&am…...

React渲染相关内容——渲染流程API、Fragment、渲染相关底层API

React渲染过程依次遇到的函数 在React的渲染流程中&#xff0c;从组件的创建到其UI最终呈现到屏幕上&#xff0c;会经历一系列的生命周期方法和函数。这些方法和函数对于类组件&#xff08;Class Components&#xff09;和函数组件&#xff08;Function Components&#xff09…...