Mysql底层原理十一:Mvcc

为什么要mvcc?

  • 提高并发度,如果读和写都是通过加锁的方式,并发肯定上不来,通过mvcc来实现写通过加锁,读通过mvcc readView机制
3.9.1 Undo版本链

image.png
再重复一遍,页面中的记录存放在用户表空间的数据页中,undo log存在系统表空间的undo segment中

3.9.2 ReadView
  • 内容有哪些

    • m_ids :表示生成生成ReadView时活跃的事务id列表
    • min_trx_id: 表示生成ReadView时活跃读写事务最小的id,也就是m_ids中的最小值
    • max_trx_id: 表示生成ReadView时系统分配给下一个事务的id值,
    • creator_trx_id: 表示生成该ReadView时事务id
  • 可见规则:

    • 大于max_trx_id,肯定不可见,说明我创建事务的时候,另外事务还没有创建
    • 小于 min_trx_id,肯定是可见的,说明我创建事务的时候,事务已经提交了
    • 小于max_trx_id,但是不在活跃列表中,肯定是可见的,说明更新在前查询在后,但是更新没有提交事务,所以刚开始活跃列表里有它,但是提交事务之后活跃列表就没有它了,所以更新提交完,再查一遍就能查到了
  • RC隔离级别:RC的时候需要在select的时候查询到别人提交的数据,所以RC的时候,是利用每次Select就去创建一次ReadView,保证能看到别人提交的数据

  • RR的级别:RR的时候第一个select的时候,就创建好ReadView,后续都使用的是这个ReadView,RR级别如果使用ReadView的话,没办法完全解决幻读,因为存在锁定读(不从readview里面拿数据,从数据库拿最新数据),还是会导致幻读

幻读的2种情况:

  1. Session A select * from t for update,然后 Session B insert into t, 再然后 Session A select * from t for update,就把Session B插入的数据查出来了
  2. 另外一种情况:

FireShot Capture 001 - MySQL 如何解决幻读(MVCC 原理分析) - 掘金 - juejin.cn.png

总结:

  • RR隔离级别下间隙锁才有效,RC 隔离级别没有间隙锁
  • RR隔离级别是为了解决幻读,快照读依靠mvcc控制,当前读通过间隙锁解决
  • 间隙锁和行锁合称 Next-Key Locks,每个 Next-key Locks是 [)

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

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

相关文章

OpenHarmony实战:物联网解决方案之芯海cst85芯片移植案例

本文介绍基于芯海cst85芯片的cst85_wblink开发板移植OpenHarmony LiteOS-M轻量系统的移植案例。 开发了Wi-Fi连接样例和XTS测试样例,同时实现了wifi_lite, lwip, startup, utils, xts, hdf等部件基于OpenHarmony LiteOS-M内核的适配。 移植架构上采用Board和Soc分…

【随笔】Git 高级篇 -- 相对引用2 HEAD~n(十三)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位,提升体验。 2.包大小优化 减小包中静态资源,例如图片文件,可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…

烧坏两块单片机,不知道原因?

没有看你的原理图,以下是造成烧毁芯片的几个环节: 1. 最大的可能性是你的单片机电机控制输出与电机驱动电路没有隔离。 我的经验,使用STM32控制电机,无论是直流电机脉宽调制,还是步进电机控制,控制电路与…

耐压40V、输出电压1.23-37V可调,适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片,其输出电压有固定3.3V、5.0V和12.0V的版本,可以为客户省去…

前端自动化测试-Jest

前端自动化测试 Jest官网:https://jestjs.io 安装方式 npm install --save-dev jest yarn add --dev jest cnpm add --save-dev jest 使用方法 所有以 .test.js 结尾的都是测试文件 基础用法示例 num.js: export function getSum (a, b) {return a b…

go语言实现无头单向链表

什么是无头单向链表 无头单向链表是一种线性数据结构,它的每个元素都是一个节点,每个节点都有一个指向下一个节点的指针。"无头"意味着这个链表没有一个特殊的头节点,链表的第一个节点就是链表的头。 优点: 动态大小&…

2024.4.7周报

摘要 在本周阅读的文献中,提出了基于Transformer的GAN模型,GAN的生成器和鉴别器,都是基于Transformer的编码器架构构建的,通过处理图像的方式处理时间序列数据作为该模型的输入。该模型能够生成各种长度的多维时间序列数据&#…

【完全背包求方案数问题】AcWing1023.买书(赋练习题目)

【题目链接】活动 - AcWing 输入样例1&#xff1a; 20输出样例1&#xff1a; 2输入样例2&#xff1a; 15输出样例2&#xff1a; 0输入样例3&#xff1a; 0输出样例3&#xff1a; 1 【代码】 //1023.买书——完全背包问题#include<bits/stdc.h>using namespace st…

Git - 如何重置或更改 Git SSH 密钥的密码?

Git 使用 ssh 方式拉取代码时&#xff0c;报 ssh password login&#xff0c;提示输入密码&#xff0c;这时很容易误填为 Git 的登录密码&#xff0c;其实这时需要输入 SSH 证书的密码&#xff0c;下面直接提供更改以及重新导入证书的方式。 首先需要确认你的本地是否有 SSH 钥…

cesium 使用一张图片作为背景影像底图

cesium加载影像地图的时候&#xff0c;可以添加一张图片作为影像图片&#xff0c;避免一开始加载的时候地图上出现缺瓦片而不美观的情况 一、代码实现 // 添加一张图片作为影像图片&#xff0c;避免一开始加载的时候地图上出现缺瓦片的情况var world new Cesium.SingleTileI…

使用Vue3组件的计算属性

计算属性在Vue.js的computed选项中定义&#xff0c;它可以在模板上进行双向数据绑定以展示出结果或者进行其他处理。 通常用户会在模板中定义表达式&#xff0c;非常便利&#xff0c;Vue.js的设计初衷也是用于简单运算。但是在模板中放入太多的逻辑&#xff0c;会让模板变得臃…

20230610 1+X 中级理论考试20230916 1+X 中级理论考试

20230610 1X 中级理论考试 对分组结果进行约束使用having关键字 排序使用order by&#xff0c;倒序使用desc 删除数据的DELETE语句DELETE FROM TABLENAME ArrayList实现了List接口 ArrayList中的数据是有序的 final为常量关键字&#xff0c;修饰一个变量时表示该变量为…

QT 使用QMediaPlayer实现的简易视频播放器

文章目录 效果图功能点类介绍代码介绍总结 QT 使用QMediaPlayer实现的简易视频播放器 效果图 功能点 播放指定视频全屏/退出全屏开始/暂停/重置视频拖拽到指定位置播放 类介绍 需要在配置文件中加入Multimedia, MultimediaWidgets这俩个库。Multimedia&#xff1a;提供了一套…

演示python连接数据库

先准备好数据库的配置&#xff0c; 域名&#xff0c;端口号&#xff0c;用户&#xff0c;密码&#xff0c;数据库名称。安装好【pymysql】库。 注意这里的db里&#xff0c;输入 数据库的分库名称&#xff0c;不是输数据库的名称 # 导包 import pymysql# # 连接到MySQL数据库 …

Jackson 2.x 系列【15】序列化器 JsonSerializer

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 概述2. 方法2.1 构造2.2 序列化2.3 其他 3. 实现类3.1 StdSerializer3.1.1 源…

说说TCP为什么需要三次握手和四次挥手?

一、三次握手 三次握手&#xff08;Three-way Handshake&#xff09;其实就是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包 主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备 过程如下&#xff…

12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?归并排序和快速排序

 下载APP  12 | 排序&#xff08;下&#xff09;&#xff1a;如何用快排思想在O(n)内查找第K大元素&#xff1f; 2018-10-17 王争数据结构与算法之美进入课程 讲述&#xff1a;修阳 时长21:58大小8.81M  上一节我讲了冒泡排序、插入排序、选择排序这三种排序算法&…

Linux系统软件安装

实战&#xff1a;在Linux上部署各类软件 MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统&#xff08;后续简称MySQL&#xff09;&#xff0c;是一款知名的数据库系统&#xff0c;其特点是&#xff1a;轻量、简单、功能丰富。 MySQL数据库可谓是软件行业的明…

数据库不用mmap

你确定你想用 MMAP 实现数据库么&#xff1f;_哔哩哔哩_bilibili MMAP 的随机读与顺序读的性能表现不好&#xff0c;以及对于写主要是不可控的刷入时机以及代码冗余&#xff0c;所以 MMAP 不适合在数据库中使用。 mmap是posix系统调用&#xff0c;它提供由操作系统管理内存映…