MVCC详解,深入浅出简单易懂

news/2024/10/2 18:30:16

转载自 https://blog.csdn.net/lans_g/article/details/124232192

配合 https://www.bilibili.com/video/BV1Hr421p7EK 视频观看更佳。

一、什么是MVCC?

mvcc,也就是多版本并发控制,是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。

数据库并发有以下几种场景:

  • 读-读:不存在任何问题。
  • 读-写:有线程安全问题,可能出现脏读、幻读、不可重复读。
  • 写-写:有线程安全问题,可能存在更新丢失等。

mvcc解决的就是读写时的线程安全问题,线程不用去争抢读写锁

mvcc所提到的读是快照读,也就是普通的select语句。快照读在读写时不用加锁,不过可能会读到历史数据。

还有一种读取数据的方式是当前读,是一种悲观锁的操作。它会对当前读取的数据进行加锁,所以读到的数据都是最新的。主要包括以下几种操作:

  • select lock in share mode(共享锁)
  • select for update(排他锁)
  • update(排他锁)
  • insert(排他锁)
  • delete(排他锁)

二、MVCC的实现

1.回顾事务的特性

  • 原子性:通过undolog实现。
  • 持久性:通过redolog实现。
  • 隔离性:通过加锁(当前读)&MVCC(快照读)实现。
  • 一致性:通过undolog、redolog、隔离性共同实现。

2.回顾事务的隔离级别

  • 读未提交:允许读取尚未提交的数据变更。可能会导致脏读、幻读或不可重复读
  • 读已提交:允许读取已经提交的数据。可能会导致幻读和不可重复读
  • 可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。可能会导致幻读
  • 可串行化:最高隔离级别。

在读已提交和可重复读隔离级别下的快照读,都是基于MVCC实现的!

3.mvcc实现原理

​ mvcc的实现,基于undolog版本链readview

在mysql存储的数据中,除了我们显式定义的字段,mysql会隐含的帮我们定义几个字段。

  • trx_id:事务id,每进行一次事务操作,就会自增1。

  • roll_pointer:回滚指针,用于找到上一个版本的数据,结合undolog进行回滚。

什么是readview呢?

当我们用select读取数据时,这一时刻的数据会有很多个版本(例如上图有四个版本),但我们并不知道读取哪个版本,这时就靠readview来对我们进行读取版本的限制,通过readview我们才知道自己能够读取哪个版本

在一个readview快照中主要包括以下这些字段:

image-20220417154721232

对readview中的参数做一些解释

m_ids:活跃的事务就是指还没有commit的事务。

max_trx_id:例如m_ids中的事务id为(1,2,3),那么下一个应该分配的事务id就是4,max_trx_id就是4。

creator_trx_id:执行select读这个操作的事务的id。

readview如何判断版本链中的哪个版本可用呢?(重点!)

image-20220417160003011

从上到下分别为(1)(2)(3)(4),依次进行解释

trx_id表示要读取的事务id

(1)如果要读取的事务id等于进行读操作的事务id,说明是我读取我自己创建的记录,那么为什么不可以呢。

(2)如果要读取的事务id小于最小的活跃事务id,说明要读取的事务已经提交,那么可以读取。

(3)max_trx_id表示生成readview时,分配给下一个事务的id,如果要读取的事务id大于max_trx_id,说明该id已经不在该readview版本链中了,故无法访问。

(4)m_ids中存储的是活跃事务的id,如果要读取的事务id不在活跃列表,那么就可以读取,反之不行。

4.mvcc如何实现RC和RR的隔离级别

(1)RC的隔离级别下,每个快照读都会生成并获取最新的readview

(2)RR的隔离级别下,只有在同一个事务第一个快照读才会创建readview,之后的每次快照读都使用的同一个readview,所以每次的查询结果都是一样的

5.幻读问题
  • 快照读:通过mvcc,RR的隔离级别解决了幻读问题,因为每次使用的都是同一个readview。
  • 当前读:通过next-key锁(行锁+gap锁),RR隔离级别并不能解决幻读问题

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

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

相关文章

Mesh-gpt(点处理、保存脚本,Transformer)

小结: 1、配置了学长的环境,并编写点处理(旋转、镜像)和保存(由内存numpy数组到shp文件)脚本。 2、初步阅读mesh-gpt论文,思考Transformer网络架构(翻译模型和补全模型的训练区别)环境配置 pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-u…

自定义组件

本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/18391554

Magnet Acquire 2.71 Windows - 适用于智能手机和计算机的数字取证采集工具

Magnet Acquire 2.71 Windows - 适用于智能手机和计算机的数字取证采集工具Magnet Acquire 2.71 Windows - 适用于智能手机和计算机的数字取证采集工具 Digital Forensic Software 请访问原文链接:https://sysin.org/blog/magnet-acquire/,查看最新版。原创作品,转载请保留出…

Transformer网络架构

只有理解了,才能在超越经验的情况下,生成出合理的内容编解码encoder-decoder结构什么是“码”?剥离形式的表示(各种语言的不同),剩下的语义关系(上下文语义)“码”的要求:1、数字化 2、语义关系的距离分词器和one-hot编码在2不足需要找到一个纬度高,但是又没那么高的…

Gluon 编译 JavaFx - android apk

Gluon 编译 JavaFx -> android apk 本文的内容属 在linux服务器上 搭建 Gluon 编译 android-apk 环境 这一篇文章直接跟着官网操作一次性成功 虚拟机版本centos8 Architecture: x86-64开始安装相关前置工具gcc version 6 or higher ld version 2.26 or highersudo yum updat…

vue axios

axios是基于promise的http库,可以用在浏览器和node.js中 特性:从浏览器中创建XMLHttpRequests、从node.js创建http请求、支持promiseApi、拦截请求和响应、取消请求、自动转换JSON数据、客户端支持防御xsrf axios就是一个库,也可以单独独立出来发送ajax。 安装: npm install…

正点原子Linux C应用编程:移植tslib并使其适配7寸LCD1024*600的GT911触摸驱动

正点原子Linux C应用编程:移植tslib并使其适配7寸LCD1024*600的GT911触摸驱动 作者在学习【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.4时,发现移植tslib后,触摸事件触发不正常。 使用的硬件版本:正点原子 I.MX6U ALPHA V2.4版本底板,LCD:正点原子7寸1024*600,型号A…

记一次Hyperf定时任务内存异常问题

背景 最近时不时收到 K8S 告警提示项目 POD 出现 OOM 问题,只要触发了项目重新部署或者把 POD 删掉,内存就恢复了,过了一段时间才缓慢增长(基本上要隔几天,这也是这个问题比较难定位和复现的原因) 分析 起初以为是某一个SQL没有限制 limit 或者是程序有死循环把内存跑满了…