MVCC 是否彻底解决了事物的隔离性 ?

news2025/1/14 1:18:36

目录

1. 什么是 MVCC

2. MVCC 是否彻底解决了事物的隔离性

3. MySQL 中如何实现共享锁和排他锁

4. MySQL 中如何实现悲观锁和乐观锁


1. 什么是 MVCC

        MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种多版本并发控制机制,它通过给每一个操作加上一个版本号,来解决它的隔离性问题!(主要是用来解决幻读问题

        它使用了快照读的方式,将历史版本的结果集保存到缓存中(ReadView),那么后续需要查询结果集的时候,就不会进行实时的查询(当前读),而是从历史版本中找到与当前查询操作所对应的版本号匹配的结果集。(版本号是全局共享的)

        MVCC 虽然主要用来解决幻读问题的,它也是可以解决不可重复读问题的,并且 MVCC 是 MySQL 内置的一个机制,先来看看 MVCC 是如何解决不可重复读问题的:

数据库中原数据:

客户端 1 执行如下操作:

// 1.开启事物 A  [版本 1]
begin; 

// 2.查询 user 表中 id 为 3 的用户身份信息 [版本 1]
select * from user where id = 3; 

// 3.等事物 B 执行修改操作后,再次查询 id 为 3 的用户 [取缓存中的版本 1]
select * from user where id = 3;

客户端 2 执行如下操作:

// 开启事物 [版本 1]
begin;

// 等事物 A 执行完第一次查询操作时,将 id 为 3 的用户名改为王老五 [版本 2]
update user set name = '王老五' where id= 3;

// 提交事物
commit;

// 此时可以再开一个客户端 3,验证一下数据库中是否已经是最新数据

 经过上述两步操作之后,可以得出以下结果 >>

  • 客户端 1:因为客户端 1 只执行了开启事务,并没有提交事物,所以客户端 1 第二次查询得到的数据行的 name 依然是 王五。
  • 客户端 3 :因为客户端 2 执行了修改操作,并提交事物,那么客户端 3 查询得到的数据行的 name 就变成了 王老五。

MVCC 的核心思想:

        MVCC 将每个事物的读和写操作进行解耦,通过保存数据的历史版本来实现并发控制。每个事物在开始的时候会创建一个读视图(ReadView),用于确定在事物开始时可见的数据版本。在 MVCC 中,当一个事物执行写操作时,会生成一个新的数据版本并将旧版本的数据保存在回滚日志(Undo Log)中。这样其他事物在读取数据时,仍然可以访问到旧版本的数据,从而避免了幻读问题和不可重复读问题。

(历史版本的数据就类似于对之前查询出来的结果集拍张照,在当前事物还没执行完,还需要查询时,直接从缓存中拿那个版本的照片)

2. MVCC 是否彻底解决了事物的隔离性

        在面试中如果被问到这个问题了,那么回答没有彻底解决。虽然 RR 隔离级别中通过 MVCC 解决大部分幻读问题,但是依然存在幻读问题。

请看示例,原数据:

 客户端 1 执行如下操作:

// 事物 A
begin;

select * from user where id > 0 and id < 9;

// 等待事物 B 执行完新增操作后,使用下面两种方式进行查询
select * from user where id > 0 and id < 9; [快照读]

select * from user where id > 0 and id < 9 for update; [当前读]

客户端 2 执行如下操作:

begin;

// 事物 B 执行新增操作
insert into user(id,name,age,address) values(4,'老六',66,'广州');

commit;

最终执行结果:

  • 事物 A 使用快照读(读缓存)的方式,查询结果集仍然是 3 条,(MVCC机制保护)
  • 事物 A 使用当前读(实时读)的方式,查询结果集变成了 4 条。(存在幻读问题)

【解决方案】既然 MVCC 也不能解决幻读问题,那么该怎么解决幻读问题 ??

  • 方案一:加锁 + RR隔离级别
  • 方案二:使用串行化隔离级别

MySQL 中如何加锁,使用 for update (既是当前读,也是加锁),示例:

select * from user where id > 0 and id < 9 for update; // 排他锁(写锁)

        当事物 A 在执行时,进行锁表操作,那么事物 B 开启事物后,想要执行新增操作,但是事物 A 已经执行锁表操作了,所以事物 B 尝试获取锁,发现获取不到,一段时间后就放弃了,所以显示获取锁超时的错误(默认超时时间为 50s)。

3. MySQL 中如何实现共享锁和排他锁

共享锁也称为读锁,它允许多个事物同时获取同一数据的共享锁,用于读数据。

语法:  select... lock in share mode

select * from user wehre id = 1 lock in share mode;

排他锁也称为写锁,它只允许一个事物获取排他锁,用于修改数据。

语法: select .... for update

select * from user where id = 1 for update;

4. MySQL 中如何实现悲观锁和乐观锁

1. 悲观锁

悲观锁就是通过加上 for update 进行锁表的操作实现的

2. 乐观锁

MySQL 没有内置乐观锁的实现,需要在业务代码中通过手动指定版本号来实现。

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

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

相关文章

QGraphicsItem 实例4 图元的旋转、缩放、切变和位移

实现图元的旋转、缩放、切变和位移 效果&#xff1a; mainwindow.h #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QWidget> #include <QGraphicsView> #include <QGraphicsScene> #include <QFrame> #include <QGraphicsView> #inclu…

部门用户权限应用设计及创建&一些实用小细节

前言 之前边做应用程序边完善数据库表&#xff0c;应用程序做出来了&#xff0c;但是数据库表也面目全非了&#xff0c;很多数据库字段都要重新设计&#xff0c;踩了个坑但是也是一种学习&#xff1a;每次代码开发也好&#xff0c;应用程序搭建也好&#xff0c;先做好数据库表…

深入探究 Java 8 新特性:Optional 类允许为空的对象类

深入探究 Java 8 新特性&#xff1a;Optional 类 概念说明 ​ 在 Java 8 中&#xff0c;引入了许多令人兴奋的新特性&#xff0c;其中之一就是 Optional 类。这个类主要用于解决空指针异常&#xff08;NullPointerException&#xff09;的问题&#xff0c;提供了一种更安全和…

kali换源之后更新

kali换源之后更新 1.更新索引 apt-get update 2.更新软件 apt-get upgrade 3.删除缓存包 apt-get clean

【网络教程】如何创建/添加钉钉机器人以及如何获取机器人的Token/Secret

文章目录 创建钉钉机器人添加钉钉机器人获取机器人的Token/Secret相关网站创建钉钉机器人 这里以PC端的操作为例,按照如下操作进行 访问 钉钉开放平台选择机器人选项卡,点击右上角的创建应用,这里会有一个弹窗,我这里选择的是继续使用旧版,如图按照要求填写相关信息创建自…

【Influxdb数据迁移,从windos移到linux】

前提——保证两边的版本不要相差太多 1、windows的导出G:\influxdb\2为暂存的目录 D:\influxdb-1.8.3_windows_amd64\influxdb-1.8.3-1>influxd backup -portable -database mydb G:\influxdb\2导出之后会有一堆文件 全部上传到/var/lib/influxdb这个目录下。这个应该是默…

vue3中使用第三方插件mitt实现任意组件通讯

vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一&#xff0c;现在我在写代码时&#xff0c;一个组件的代码超过了200行&#xff0c;基本都会拆分组件。组件拆分后&#xff0c;组件之间的通讯就很重要&#xff0c;总结了一下&#xff0c;目前有这…

阿里云席明贤:明天的视频云2.0

编者按 本文是“解构多媒体新常态”系列文章的第二篇&#xff0c;LiveVideoStack对话了阿里云视频云负责人席明贤&#xff08;花名右贤&#xff09;。面对风云变幻的内外环境&#xff0c;阿里云在视频云赛道是坚定向前的&#xff0c;在与右贤的接触中&#xff0c;他给我留下非常…

回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序…

基于医疗领域数据微调LLaMA——ChatDoctor模型

文章目录 ChatDoctor简介微调实战下载仓库并进入目录创建conda环境并配置环境&#xff08;安装相关依赖&#xff09;下载模型文件微调数据微调过程全量微调基于LoRA的微调基于微调后的模型推理 ChatDoctor简介 CHatDoctor论文&#xff1a; ChatDoctor: A Medical Chat Model F…

JavaScript:交集和差集的应用场景

在集合A和集合B中&#xff0c;属于集合A&#xff0c;同时也属于集合B的元素组成的集合&#xff0c;就是交集。 在A中所有不属于集合B元素&#xff0c;组合成集合&#xff0c;就是差集。 那么在平时的开发中&#xff0c;如何使用差集和交集来解决问题呢&#xff1f; 现在有这…

Fixed Price Incentive Fee (FPIF)

总价加激励费用 (FPIF)。这种总价合同为买方和卖方提供了一定的灵活性&#xff0c;允许一定的绩 效偏离&#xff0c;并对实现既定目标给予相关的财务奖励&#xff08;通常取决于卖方的成本、进度或技术 绩效&#xff09;。FPIF 合同中会设置价格上限&#xff0c;高于此价格上限…

剑指 Offer 61. 扑克牌中的顺子(C++实现)

剑指 Offer 61. 扑克牌中的顺子https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/ 优雅写法 bool isStraight(vector<int>& nums) {int maxVal INT_MIN, minVal INT_MAX;unordered_set<int> s;for (const int num : nums){if (num 0) // 跳过…

基于STM32+FreeRTOS的四轴机械臂

目录 项目概述&#xff1a; 一 准备阶段&#xff08;都是些废话&#xff09; 二 裸机测试功能 1.摇杆控制 接线&#xff1a; CubeMX配置&#xff1a; 代码&#xff1a; 2.蓝牙控制 接线&#xff1a; CubeMX配置 代码&#xff1a; 3.示教器控制 4.记录动作信息 5.执…

Matlab 频谱图中如何设置频率刻度

Matlab 频谱图中如何设置频率刻度&#xff08;横坐标&#xff09; 1、概述 时域信号经FFT 变换后得到了频谱&#xff0c;在作图时还必须设置正确的频率刻度&#xff0c;这样才能从图中得到正确的结果。下面来介绍如何设置正确的频率刻度。 2、案例分析 有一个余弦信号&#…

浏览器渲染原理 - 输入url 回车后发生了什么

目录 渲染时间点渲染流水线1&#xff0c;解析&#xff08;parse&#xff09;HTML1.1&#xff0c;DOM树1.2&#xff0c;CSSOM树1.3&#xff0c;解析时遇到 css 是怎么做的1.4&#xff0c;解析时遇到 js 是怎么做的 2&#xff0c;样式计算 Recalculate style3&#xff0c;布局 la…

Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示

目录 效果build.gradle&#xff08;app&#xff09;添加的依赖&#xff08;用不上的可以不加&#xff09;AndroidManifest.xml错误activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL 效果 build.gradle&#xff08;app&#xff09;添加的依赖&…

STM32 printf函数

printf函数输出流程 用户调用printf()函数到C标准库调用printf函数相关部分&#xff0c;printf函数由编译器提供的stdio.h解析。包含在usart.h文件中。fputc()最终实现输出。用户需要根据最终输出的硬件重新定义该函数&#xff0c;此过程为&#xff1a;printf重定向。 printf的…

用它来画文档插图简直太方便了

支持常用的12864接口&#xff0c;图像可保存&#xff0c;鼠标左键可delete键删除选区&#xff0c;鼠标右键抓取坐标。 支持快捷撤销操作CtrlZ、回退操作CtrlY&#xff0c;可点击此处下载软件。

Educational Codeforces Round 153 (Rated for Div. 2)ABC

Educational Codeforces Round 153 (Rated for Div. 2) 目录 A. Not a Substring题目大意思路核心代码 B. Fancy Coins题目大意思想核心代码 C. Game on Permutation题目大意思想核心代码 A. Not a Substring 题目大意 给定一个只包含“&#xff08;”和“&#xff09;”这两…