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.hqwc.cn/news/78152.html

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

相关文章

线性代数的学习和整理10:各种特殊类型的矩阵(草稿-----未完成 建设ing)

非特殊矩阵 矩阵的类型 第2大类 图形化分类 8 对角线矩阵 三角矩阵 上三角矩阵 对称矩阵 零矩阵 梯形矩阵 下面的分类&#xff0c;功能性分类 增广矩阵 伴随矩阵 正交矩阵

计算机竞赛 交通目标检测-行人车辆检测流量计数 - 计算机竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

3招教你释放储存空间:iPhone手机内存不足怎样清理最彻底

无论是什么手机&#xff0c;一旦使用时间长了&#xff0c;手机就会产生大量不必要的文件&#xff0c;从而导致手机内存不足&#xff0c;运行缓慢、卡顿。想要删除没用的文件该怎么做&#xff1f;iPhone手机内存不足怎样清理最彻底&#xff1f;今天就让小编来给大家分享一下&…

【JavaEE基础学习打卡04】JDBC之MySQL数据库安装

目录 前言一、JDBC与数据库二、MySQL数据库1.MySQL数据库2.MySQL服务下载安装3.MySQL服务启动停止4.MySQL命令 三、MySQL客户端安装总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好者&#xff0c;小白白。我们的天赋并不高&#xff0c;可贵在努力&#xff0c;坚持…

【BASH】回顾与知识点梳理(三十六)

【BASH】回顾与知识点梳理 三十六 三十六. 认识与分析登录档36.1 什么是登录档CentOS 7 登录档简易说明登录档的重要性Linux 常见的登录档档名登录档所需相关服务 (daemon) 与程序CentOS 7.x 使用 systemd 提供的 journalctl 日志管理 登录档内容的一般格式 36.2 rsyslog.servi…

Python批量爬虫下载文件——把Excel中的超链接快速变成网址

本文的背景是&#xff1a;大学关系很好的老师问我能不能把Excel中1000个超链接网址对应的pdf文档下载下来。虽然可以手动一个一个点击下载&#xff0c;但是这样太费人力和时间了。我想起了之前的爬虫经验&#xff0c;给老师分析了一下可行性&#xff0c;就动手实践了。    没…

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态&#xff0c;显示如图&#xff1a; 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮&#xff0c;打开计算机管理点击服务

Docker容器无法启动 Cannot find /usr/local/tomcat/bin/setclasspath.sh

报错信息如下 解决办法 权限不够 加上--privileged 获取最大权限 docker run --privileged --name lenglianerqi -p 9266:8080 -v /opt/docker/lenglianerqi/webapps:/usr/local/tomcat/webapps/ -v /opt/docker/lenglianerqi/webapps/userfile:/usr/local/tomcat/webapps/u…

1.0的星火2.0必将燎原——图文声影PPT全测试

一、前言 大家好&#xff0c;勇哥又来分享AI模型了&#xff0c;前几天讯飞发布的星火大模型2.0迅速的进入了我们圈子里&#xff0c;为了有更多更好的模型分享给大家&#xff0c;分享星火大模型2.0是必须做的&#xff0c;我做一个传递着&#xff0c;希望大家也星火相传啊。 我…

什么是CSS中的BFC?

①什么是BFC BFC 全称&#xff1a;Block Formatting Context&#xff0c; 名为 “块级格式化上下文”。 W3C官方解释为&#xff1a;BFC它决定了元素如何对其内容进行定位&#xff0c;以及与其它元素的关系和相互作用&#xff0c;当涉及到可视化布局时&#xff0c;Block Forma…

【数据结构】二叉树 链式结构的相关问题

本篇文章来详细介绍一下二叉树链式结构经常使用的相关函数&#xff0c;以及相关的的OJ题。 目录 1.前置说明 2.二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层次遍历 3.节点个数相关函数实现 3.1 二叉树节点个数 3.2 二叉树叶子节点个数 3.3 二叉树第k层节点个数 3…

15. Canvas制作汽车油耗仪表盘

1. 说明 本篇文章在14. 利用Canvas组件制作时钟的基础上进行一些更改&#xff0c;想查看全面的代码可以点击链接查看即可。 效果展示&#xff1a; 2. 整体代码 import QtQuick 2.15 import QtQuick.Controls 2.15Item{id:rootimplicitWidth: 400implicitHeight: implicitWi…