简单聊聊MVCC

简介: 本文章仅仅是从一个点来讲MVCC,比较粗浅,并不能代表这就是全部的MVCC。网上还有许多其他详细的MVCC介绍文章,可以结合起来阅读。

前言:本文章仅仅是从一个点来讲MVCC,比较粗浅,并不能代表这就是全部的MVCC。网上还有许多其他详细的MVCC介绍文章,可以结合起来阅读。


一、MVCC如何实现



数据库中有两个隐含的列,一个是DB_TRX_ID(事务id),另一个是DB_ROLL_PTR(回滚指针)。事务ID是一个自增id,他表示事务创建时候的顺序;回滚指针指向前一个事务版本的数据

ea0d2b67a858487bb48743ed00288002.png


像这样,如果事务10执行失败了,可以回滚到事务7。那么为什么10前面不是9呢?因为9可能操作的不是ID为1的数据。


那么,是否所有的事务都需要像这样记录在视图链上呢?不是的,如果一直记录,必然会有占满磁盘的时候。如果一条链上的最后一个事务已经提交了,那么这条链就可以删除。


那么在RR(可重复度)隔离级别下,哪些数据可以看得到,哪些看不到呢?


例如,当前事务id为cur_id,


1.事务id > cur_id的事务操作的数据全部都看不到,因为这些事务是在当前事务之后才出现的

2.事务id = cur_id的事务操作的数据全都可以看到,因为这本来就是当前事务处理的数据

3.事务id < cur_id的事务操作的数据:


已经提交的,可以看到

没有提交的,不能看到


面对不能看到的数据,我们就根据视图链往下找,直到找到能够看到的数据。会不会存在找不到的情况呢?不会,因为视图链最下面的一条数据一定是已经提交的数据。


MySQL为了优化性能,还将最小活跃事务id到当前id中的活跃id放在了一个集合中,便于判断。


二、MVCC是否可以解决幻读



这也是争议比较大的话题,欢迎讨论。

一句话说结论:MVCC可以在一定程度上避免幻读


一句话解释:说一个MVCC下的幻读情况。比如说事务9正在执行过程中,select一下,之后,事务7提交了一个insert,这个commit对于事务9来说是可见的,然后事务9又select一下。那么这两次select的行数肯定是不一样的,这样就发生了幻读。


【参考】:b站博主free-coder的视频:【mysql】mvcc介绍 通俗易懂_哔哩哔哩_bilibili










相关文章
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
7042 0
Winform控件优化之TabControl控件的使用和常用功能
|
5月前
|
存储 人工智能 算法
CodeBuddy实现图片压缩工具
使用 CodeBuddy 实现图片压缩工具,对开发者和用户都有着显著的好处。对于开发者来说,借助 CodeBuddy 高效的开发能力,可以在更短时间内完成工具开发,将更多精力投入到功能优化和用户体验提升上。同时,CodeBuddy 的智能辅助功能有助于开发者学习和掌握新的开发技术和算法,提升自身技术水平。
106 7
|
8月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课5 在线备份
本文介绍了如何在PolarDB RAC一写多读集群中进行在线备份,特别针对共享存储模式。通过使用`polar_basebackup`工具,可以将实例的本地数据和共享数据备份到本地盘中。实验环境依赖于Docker容器中用loop设备模拟的共享存储。
187 1
|
网络协议 安全 Java
Java Socket原理
Java Socket原理是指在Java中通过Socket实现的网络通信的基础理论与机制。Socket是网络中不同设备间通信的一种标准方式,它允许应用程序之间通过TCP/IP等协议进行数据交换。在Java中,利用Socket编程可以方便地创建客户端与服务器端应用,实现跨网络的数据传输功能,是互联网软件开发中的重要技术之一。它支持多种通信模式,如可靠的流式套接字(TCP)和数据报式套接字(UDP)。
196 10
|
8月前
|
存储 弹性计算 人工智能
算力性能提升20%!阿里云第九代ECS g9i企业级实例全球邀测
算力性能提升20%!阿里云第九代ECS g9i企业级实例全球邀测
288 0
|
10月前
|
人工智能 分布式计算 运维
云财务管理产品更新:助力客户简化FinOps落地
本次分享由阿里云财务管理产品公司负责人贾栋梁主讲,探讨企业上云后内部管理系统的变化及云上财务管理产品的边界。内容涵盖云财务管理产品如何支持FinOps实现业财一体化,以及账单、成本管理和组织管理等核心功能的优化。通过提升账单透明度、简化成本分析和增强企业级能力,帮助企业更好地进行云上财务管理。
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
852 12
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
安全 编译器 C++
C++一分钟之-泛型Lambda表达式
【7月更文挑战第16天】C++14引入泛型lambda,允许lambda接受任意类型参数,如`[](auto a, auto b) { return a + b; }`。但这也带来类型推导失败、隐式转换和模板参数推导等问题。要避免这些问题,可以明确类型约束、限制隐式转换或显式指定模板参数。示例中,`safeAdd` lambda使用`static_assert`确保只对算术类型执行,展示了一种安全使用泛型lambda的方法。
184 1
|
JSON 数据挖掘 编译器
Anconda环境下Vscode安装Python(1)
Anconda环境下Vscode安装Python(1)
Anconda环境下Vscode安装Python(1)