一条记录的多幅面孔-事务的隔离级别与 MVCC

news2025/7/18 6:28:44

一、事务隔离级别

  1. 引出:**事务的隔离性要求,**理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继续访问这个数据。我们既想保持事务的 隔离性 ,又想让服务器在处理访问同一数据的多个事务时性能尽量高些舍一部分 隔离性 而取性能者也。
  2. 事务并发执行遇到的问题
    (1)脏写一个事务修改了另一个未提交事务修改过的数据
    (2)脏读一个事务读到了另一个未提交事务修改过的数据
    (3)不可重复读:如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值
    (4)幻读:一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先
    的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来。幻读重点强调了读取到了之前读取没有获取到的记录
  3. SQL标准中的四种隔离级别
    (1)READ UNCOMMITTED :未提交读
    (2)READ COMMITTED :已提交读
    (3)REPEATABLE READ :可重复读
    (4)SERIALIZABLE :可串行化
    各个隔离级别下,允许发生的事务并发下遇到的问题
    在这里插入图片描述
    注意:因为脏写这个问题太严重了,不论是哪种隔离级别,都不允许脏写的情况发生。
  4. MySQL中支持的四种隔离级别
    注意:MySQL在REPEATABLE READ隔离级别下,是可以禁止幻读问题的发生的。与sql标准中规定有出入。MySQL 的默认隔离级别为 REPEATABLE READ(可手动修改)。

二、MVCC原理

  1. 版本链
    前言对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列:
    (1)trx_id :每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的 事务id 赋值给 trx_id 隐藏列
    (2)roll_pointer :每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到 undo日志 中,然后这个隐藏
    列就相当于一个指针,可以通过它来找到该记录修改前的信息(找到对应的undo日志)。

    版本连介绍展示如下:在这里插入图片描述在这里插入图片描述
    可以看到,第一张图中的两个事务的sql操作语句,形成了一个版本链(包括最新的记录和undo日志)。每个版本中还包含生成该版本时对应的 事务id
  2. ReadView
    ReadView 中主要包含4个比较重要的内容:
    (1)m_ids :表示在生成 ReadView 时当前系统中活跃的读写事务的 事务id 列表。
    (2)min_trx_id::m_ids 中的最小值。
    (3)max_trx_id:表示生成 ReadView 时系统中应该分配给下一个事务的 id 值。
    (4)creator_trx_id :表示生成该 ReadView 的事务的 事务id 。
    ReadView的作用需要判断一下版本链中的哪个版本是当前事务可见的
  3. ReadView的例子介绍
    (1)在 MySQL 中, READ COMMITTED 和 REPEATABLE READ 隔离级别的的一个非常大的区别就是它们生成ReadView的时机不同
    首先看在 READ COMMITTED 隔离级别下的。在这里插入图片描述

开启二个事务(id=100,200),在id=100的事务中修改名字的值,二个事务均未提交。然后通过查询语句,查询语句执行时候会生成一个ReadView,它的m_ids列表为[100, 200],min_trx_id 为 100 , max_trx_id 为 201 , creator_trx_id 为 0 。那么这次查询到的结果是版本号小于min_trx_id(100)的,所以查到的是 ‘刘备’。
之后提交一下id=100的事务,再次查询时候,会新生成一个ReadView, 它的m_ids列表为[200],min_trx_id 为 200 ,
max_trx_id 为 201 , creator_trx_id 为 0 。那么此时就需要版本号满足小于min_trx_id(200)的才能查询到,所以查到的是’张飞’。
总结一下就是:使用READ COMMITTED隔离级别的事务在每次查询开始时都会生成一个独立的ReadView。

然后再看在 REPEATABLE READ 隔离级别下的。
这个与上一个的区别就是,只会在一个事务中第一次查询建立ReadView,那么对应到上一个修改名字的例子就是,在两个事务均未提交时候,执行查询语句时会生成一个ReadView, 它的m_ids列表为[100, 200],min_trx_id 为 100 , max_trx_id 为 201 , creator_trx_id 为 0 。查询到的是 ‘刘备’。
之后提交一下id=100的事务,再次查询时候,会使用 原来的ReadView,所以查询到的还是 ‘刘备’。这也和这种隔离级别(REPEATABLE READ)很符合(可重复读)。
4. MVCC小结
从上边的描述中我们可以看出来,所谓的 MVCC (Multi-Version Concurrency Control ,多版本并发控制)指的就
是在使用 READ COMMITTD 、 REPEATABLE READ 这两种隔离级别的事务在执行普通的 SEELCT 操作时访问记录的版
本链的过程,这样子可以使不同事务的 读-写 、 写-读 操作并发执行,从而提升系统性能。
READ COMMITTD 、
REPEATABLE READ 这两个隔离级别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一
次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作
前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。

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

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

相关文章

CCED,落下帷幕,国产新型编辑技术的锋芒,终于露出来了

大家还记得在DOS时代,你们常用的办公软件有哪些吗? 想必一定少不了朱崇君的CCED和求伯君的WPS吧,前者是字表处理,后者是文字处理。在DOS时代,这两个软件用起来真的是得心应手啊。 而这个时代,也成为了CCE…

jupyter中的魔法函数

在jupyter中,使用魔法函数可以简单的实现一些单纯python要很麻烦才能实现的功能。 1. % 行魔法函数,只对本行代码生效。 2. %% Cell魔法函数,在整个Cell中生效,必须放于Cell首行。 3. %lsmagic: 列出所有的魔法函数 4…

Android Gradle —— flavorDimensions 与 productFlavors

参考: Android Gradle(3)— FlavorDimensions_积跬步_图腾的博客-CSDN博客 flavorDimensions和productFlavors——安卓gradle_猛猛的小盆友的博客-CSDN博客 多维度打包的介绍 flavorDimensions 从单词字面理解知道是 “风味维度”&#xf…

jsp小练习01--jdbc小练习01

目录 jsp小练习01 jdbc小练习01 设计数据库 以下是一个基本的登录页面(login.jsp): 以下是checklogin.jsp页面的示例代码: 以下是main.jsp页面的示例代码: 以下是add.jsp页面的示例代码: 以下是doa…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)——第三章 AI应用开发

第1节 课程概述 第1单元 本课程是否适合您 1.没有深度学习的背景 边学习边补充基础 2.少量深度学习背景,但并不了解华为昇腾 对于昇腾的学习是贯穿全程的 3.听说过或接触过华为昇腾,但不知道如何基于昇腾使能AI应用。 保持学习,按时交作业…

Letcode 两数之和

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以…

Wi-Fi 6(802.11ax)解析12:下行OFDMA接入机制(DL-OFDMA)

序言 在介绍完802.11ax的信道接入以及其触发帧机制后,本文着重介绍下行OFDMA的接入机制(即DL-OFDMA) 下行OFDMA接入机制(DL-OFDMA) OFDMA是一种多用户通信机制,其只适用于802.11ax AP和802.11ax用户之间…

ChatGPT 学习 ES lucene 底层写入原理,源码

一直有个疑问“学习最新版lucene 数据写入相关的源码,应该看哪些源码,以什么顺序看(先看什么,后看什么)?” 对于Lucene的数据写入过程,可以分为以下几个阶段 在学习Lucene的数据写入相关的源码…

FTP服务

一、FTP的简介 FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的…

C++笔记——第十四篇 哈希

目录 一、unordered系列关联式容器 1.1 unordered_map 1.1.1 unordered_map的文档介绍 1.1.2 unordered_map的接口说明 二、 底层结构 2.1 哈希概念 2.2 哈希冲突 2.3 哈希函数 2.4 哈希冲突解决 2.4.1 闭散列 1. 线性探测 2. 二次探测 2.4.2 开散列 三、 哈希的应用 …

200万奖金广聚天下算法英雄,第二届广州·琶洲算法大赛要来了!

随着深度学习不断驱动技术创新,人工智能加速与实体经济深度融合发展。作为中国首个自主研发、开源开放的产业级深度学习平台,飞桨与百度自研的产业级知识增强文心大模型,共同构筑了产业智能化基座,并联合产学研用各方生态力量&…

学习风`宇博客用户权限菜单模块

文章目录 用户-角色-菜单-资源 各表关系图菜单 和 路由菜单表及分析分析 /api/admin/user/menus接口MenuServiceImpl#listUserMenus接口返回示例及分析 前端代码分析menu.jsSideBar.vue 接口权限控制资源表 及 分析分析 WebSecurityConfig权限控制整体流程先说登录UserDetailsS…

ChatGPT 有什么新奇的使用方式?

你别说,你还真别说,我对象一般用它谈恋爱!!! 我对象在谈一种很新的恋爱,不建议模仿,因为根本停不下来! 事情是这样的,我最近开始对ChatGPT感兴趣,但我这个技…

AppArmor零知识学习十四、实操与实践(2)

本文内容参考: Linux安全模块AppArmor总结-CSDN博客, apparmor首页、文档和下载 - 应用程序访问控制系统 - OSCHINA - 中文开源技术交流社区, AppArmor GitBook, AppArmor配置(二)_domybest_nsg的博客…

CESM 地球系统模式

详情点击链接:地球系统模式(CESM) CESM 运行的系统和软件环境 1.CESM需要什么运行环境 2.CESM2.0运行环境的搭建CESM 运行需要掌握的Linux及编译 1.Linux 2.Linux编译 3.基于Make 和CMake的编译体系CESM 的基本结构 1.CESM的几大功能模块 2…

德赛西威上海车展重磅发布Smart Solution 2.0,有哪些革新点?

4月18日,全球瞩目的第二十届上海车展盛大启幕,作为国际领先的移动出行科技公司,德赛西威携智慧出行黑科技产品矩阵亮相,并以“智出行 共创享”为主题,重磅发布最新迭代的智慧出行解决方案——Smart Solution 2.0。 从…

“量子+金融”!摩根大通和QC Ware拓展量子深度对冲

​ (图片来源:网络) 近日,QC Ware和摩根大通完成了一项关于量子“深度对冲”的研究,为提高未来的金融服务风险应对能力铺平了道路。 利用市场摩擦和交易约束的数据驱动模型,可以降低投资组合的风险。相关论…

Flink学习——基本概述

目录 一、Flink概述 二、单机版安装配置 1.开启hadoop 2.解压Flink压缩包 3.修改文件名 4.开启客户端 5.访问webUI 三、集群配置 1.jobmanager配置 2.master配置 3.workers配置 4.分发配置 5.开启Flink集群 6.访问webUI 7.查看Job Manager 8.查看Task Managers…

不同批次板子采集到的传感器压力值不同

问题描述: M340B空压机主控板在接正常压力气源时,显示屏显示压力值过高并报警。 问题排查: 确认可能的故障点:压力传感器、硬件电路(供电电路、分压电路、ADC采样电路等)、单片机、软件; 排…

MySQL-----表的约束

文章目录 前言一、空属性二、默认值三、列描述四、zerofil五、主键六、自增长七、唯一键八、外键总结 前言 真正约束字段是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性, 从业务逻辑角度保证数据的正确性.比如有一个字段是email,要求是唯一的…