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

目录

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.mzph.cn/news/42576.shtml

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

相关文章

webpack 和 ts 简单配置及使用

如何使用webpack 与 ts结合使用 新建项目 &#xff0c;执行项目初始化 npm init -y会生成 {"name": "tsdemo01","version": "1.0.0","description": "","main": "index.js","scripts&…

自动驾驶数据集汇总

1.Nuscenes 数据集链接&#xff1a;nuScenes nuscenes数据集下有多个任务&#xff0c;涉及Detection&#xff08;2D/3D&#xff09;、Tracking、prediction、激光雷达分割、全景任务、规划控制等多个任务&#xff1b; nuScenes数据集是一个具有三维目标注释的大型自动驾驶数…

2023-8-15差分矩阵

题目链接&#xff1a;差分矩阵 #include <iostream>using namespace std;const int N 1010;int n, m, q; int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c) {b[x1][y1] c;b[x1][y2 1] - c;b[x2 1][y1] - c;b[x2 1][y2 1] c; }int main…

基于SOLIDWORKS配置功能建立塑料模具标准件库

在塑料模具的设计过程中&#xff0c;建立其三维模型对于后续进行CAE分析和CAM加工是非常重要的。除了型腔和型芯以外&#xff0c;塑料模具中的标准件很多&#xff0c;如推杆、导柱、导套、推板、限位钉等&#xff0c;这些对于不同的产品是需要反复调用的。目前&#xff0c;我国…

汽车OTA活动高质量发展的“常”与“新”

伴随着车主的频繁崔更&#xff0c;车企除了卷硬件、拼价格&#xff0c;逐渐将精力转移到汽车全生命周期的常用常新。时至下半年&#xff0c;车企OTA圈愈发热闹&#xff0c;以新势力、新实力为代表新一代车企&#xff0c;OTA运营活动逐渐进入高质量发展期。 所谓高质量&#xf…

记录--webpack和vite原理

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 每次用vite创建项目秒建好&#xff0c;前几天用vue-cli创建了一个项目&#xff0c;足足等了我一分钟&#xff0c;那为什么用 vite 比 webpack 要快呢&#xff0c;这篇文章带你梳理清楚它们的原理…

Kotlin开发笔记:集合和逆变协变

Kotlin开发笔记&#xff1a;集合和逆变协变 Kotlin中的集合 基本的集合类型 Kotlin中的集合类型和Java差不多&#xff0c;不过有些在名称上可能有出入&#xff0c;下面是Kotlin中的一些基本集合类型&#xff1a; 类型介绍Pair两个值的元组Triple三个值的元组Array经过索引的…

去掉鼠标系列之一: 语雀快捷键使用指南

其实应该是系列之二了&#xff0c;因为前面写了一个关于Interlij IDEA的快捷键了。 为什么要写这个了&#xff0c;主要是觉得一会儿用鼠标&#xff0c;一会儿键盘&#xff0c;一点儿不酷&#xff0c;我希望可以一直用键盘&#xff0c;抛开鼠标。后面陆续记录一下各个软件的快捷…

高效使用ChatGPT之ChatGPT客户端

ChatGPT客户端&#xff0c;支持Mac, Windows, and Linux 下载地址见文章结尾 软件截图 Windows: Mac&#xff1a; 说明 chatgpt桌面版&#xff0c;相比于网页版的chatgpt&#xff0c;最大的特色是支持历史聊天对话记录导出&#xff0c;且支持三种格式&#xff1a;PNG、PDF、…

由浅入深详解四种分布式锁

在多线程环境下&#xff0c;为了保证数据的线程安全&#xff0c;锁保证同一时刻&#xff0c;只有一个可以访问和更新共享数据。在单机系统我们可以使用synchronized锁或者Lock锁保证线程安全。synchronized锁是Java提供的一种内置锁&#xff0c;在单个JVM进程中提供线程之间的锁…

小程序的数据绑定和事件绑定

小程序的数据绑定 1.需要渲染的数据放在index.js中的data里 Page({data: {info:HELLO WORLD,imgSrc:/images/1.jpg,randomNum:Math.random()*10,randomNum1:Math.random().toFixed(2)}, }) 2.在WXML中通过{{}}获取数据 <view>{{info}}</view><image src"{{…

RocketMQ 5.0 架构解析:如何基于云原生架构支撑多元化场景

作者&#xff1a;隆基 本文将从技术角度了解 RocketMQ 的云原生架构&#xff0c;了解 RocketMQ 如何基于一套统一的架构支撑多元化的场景。 文章主要包含三部分内容。首先介绍 RocketMQ 5.0 的核心概念和架构概览&#xff1b;然后从集群角度出发&#xff0c;从宏观视角学习 R…

优测云服务平台|【压力测试功能升级】轻松完成压测任务

一、本次升级主要功能如下&#xff1a; 1.多份报告对比查看测试结果 2.报告新增多种下载格式 Word格式Excel格式 3.新增多种编排复杂场景的控制器 漏斗控制器并行控制器事务控制器仅一次控制器分组控制器集合点 4.新增概览页面&#xff0c;包含多种统计维度 二、报告对比…

开源语音聊天软件Mumble

网友 大气 告诉我&#xff0c;Openblocks在国内还有个版本叫 码匠&#xff0c;更贴合国内软件开发的需求&#xff0c;如接入了国内常用的身份认证&#xff0c;接入了国内的数据库和云服务&#xff0c;也对小程序、企微 sdk 等场景做了适配。 在 https://majiang.co/docs/docke…

类与对象(上)

类与对象&#xff08;上&#xff09; 一、面向过程和面向对象的区别二、类1、类的引入2、类的定义&#xff08;1&#xff09;类的基本定义&#xff08;2&#xff09;类的成员函数的定义方法 3、类的访问限定符4、封装5、驼峰法命名规则6、类的作用域7、类的实例化&#xff08;1…

金蝶软件实现导入Excel数据分录行信息到单据体分录行中

>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 金蝶软件中实现[导入Excel数据业务分录行]信息到[金蝶单据体分录]中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地从…

IntelliJ IDEA(简称Idea) 基本常用设置及Maven部署---详细介绍

一&#xff0c;Idea是什么&#xff1f; 前言&#xff1a; 众所周知&#xff0c;现在有许多编译工具&#xff0c;如eclipse&#xff0c;pathon, 今天所要学的Idea编译工具 Idea是JetBrains公司开发的一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java…

Rancher管理K8S

1 介绍 Rancher是一个开源的企业级多集群Kubernetes管理平台&#xff0c;实现了Kubernetes集群在混合云本地数据中心的集中部署与管理&#xff0c;以确保集群的安全性&#xff0c;加速企业数字化转型。Rancher 1.0版本在2016年就已发布&#xff0c;时至今日&#xff0c;Ranche…

CS:GO升级 Linux不再是“法外之地”

在前天的VAC大规模封禁中&#xff0c;有不少Linux平台的作弊玩家也迎来了“迟到”的VAC封禁。   一直以来&#xff0c;Linux就是VAC封禁的法外之地。虽然大部分玩家都使用Windows平台进行游戏。但实际上&#xff0c;使用Linux畅玩CS:GO的玩家也不在少数。 以前V社主要打击W…

06-微信小程序-注册程序-场景值

06-微信小程序-注册程序 文章目录 注册小程序参数 Object object案例代码 场景值场景值作用场景值列表案例代码 注册小程序 每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使…