【MySQL事务(下)(重点)】

文章目录

  • 再次理解MySQL事务
  • 一、MVCC机制
    • 数据库并发的场景有三种:
    • 3个记录隐藏列字段
    • undo日志——由mysql维护的一段内存空间
      • 再次理解隔离性和隔离级别
    • Read View 理论部分
    • RR 和 RC 的本质区别


再次理解MySQL事务

  • 1.每个事务都有自己的事务ID,根据事务的大小,进行排队。
  • 2.既然事务能排队,那就不能简单地认为事务就是一堆sql语句的集合,事务在语言看来,就是一个结构体对象/类对象。
  • 3.mysql可能会面临处理多个事务的情况,事务也有自己的生命周期,所以mysql要对多个事务进行管理,那就需要先描述,再组织

一、MVCC机制

数据库并发的场景有三种:

读-读 :不存在任何问题,也不需要并发控制
读-写 :有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读(重点)
写-写 :有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失(后面补充)

重点在于第二类问题——读写。
要解决读写问题,就要学习MVCC机制,要学习MVCC机制,就要了解三个知识点:

  • 3个记录隐藏字段
  • undo日志
  • Read View

3个记录隐藏列字段

  • 1.DB_TRX_ID:占6字节,记录创建这个记录/最近修改这个记录的事务ID。
  • 2.DB_ROLL_PTR:7字节,回滚指针,跟回滚有关的。指向这条记录的上一个版本。
  • 3.DB_ROW——ID:6字节,这是一个隐藏的自增主键,如果表中没有创建主键,InnoDB会以该隐藏字段,产生一个聚簇索引。(就是建立一棵B+树,叶子节点与数据一起放的)

举例:

创建一个表,并插入一条数据:
create table if not exists student(
name varchar(11) not null,
age int not null);
mysql> insert into student (name, age) values (‘张三’, 28);

并且查看变量’autocommit’,这是一直开着的,所以,insert 这条插入sql语句,一定会被看成一个事务,自动提交了。

在这里插入图片描述

所以,看到的table,不仅仅是name,age两列,还有三个隐藏的字段:
在这里插入图片描述

因为insert语句也被看成了一个事务!

undo日志——由mysql维护的一段内存空间

这里理解undo log,简单理解成,就是 MySQL 中的一段内存缓冲区,用来保存日志数据的就行。

模拟MVCC的过程:

在上表的基础上,现在有一个事务10(仅仅为了好区分),对student表中记录进行修改(update):将name(张三)改成
name(李四)。

具体过程如下:
1.加锁
2.将修改前的整个记录,先拷贝一份到undo日志中,再将相关数据进行修改,结果如下:
在这里插入图片描述
回滚指针指向的是默认的上一条历史版本。
事务10的update语句完成后,就会释放锁。

现在又有一个事务11,对student表中记录进行修改(update):将age(28)改成age(38)。

注意:这里修改,一定不会是修改历史版本的记录,因为历史版本记录是稳定的,持久的,改的是最新版本的事务。

1.加锁
2.将现存的事务先拷贝一份到undo日志中,再更新相关数据。
3.释放锁。

在这里插入图片描述
如上,就完成了数据的更新,同时形成了一份历史版本链。
这就是对历史事务进行管理的提现:先描述再组织,这个组织的过程就用了链表。

注意一些细节问题:

  • 1.如果一个事务commit后,就无法回滚了。要知道,undo log只是一块内存缓冲区,会被写满,每次update/delete数据,都会保存一份历史版本,一旦commit后,就会把undo log的空间释放。
  • 2.对于比较特殊的insert操作,因为是新插入的操作,那么在此之前不会形成版本链,但是为了回滚操作,insert的数据也会被拷贝到undo log中,所以一旦commit之后,undo log就会被释放,也就是insert也不会回滚了。

再次理解隔离性和隔离级别

正因为有了undo log这样的缓冲区来保存历史版本数据。
才有了读写并发访问事务,不需要加锁。因为读的是历史版本事务,写的是最新数据,读写的版本位置不同就不需要加锁。所以就是隔离性,针对隔离级别,就有RU,RC,RR,串行化等几种隔离级别,本质上就是是否允许同时读写历史版本的不同位置。

那么,如何保证,不同的事务,看到不同的内容呢?也就是如何如何实现隔离级别?

Read View 理论部分

现在的问题就是,当前快照读,应不应该读到当前版本记录,也就是应不应该读到历史版本链的事务。

Read View就是一个视图,在MySQL源码中,这是一个类,当我们查看历史版本时,就会生成这个Read View。具体只需要记住该类的四个成员即可:

m_ids;      //一张列表,用来维护Read View生成时刻,系统正活跃的事务ID
up_limit_id;   //记录m_ids列表中事务ID最小的ID(没有写错)
low_limit_id;   //ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1(也没有写错,注意不是视图里面的最大事务ID+1)
creator_trx_id  //创建该ReadView的事务ID

注意:不是创建事务的时候,就形成这个Read View类,而是该事务已经存在的前提下,该事务第一次进行快照读(查看历史版本)的时候,就会形成这个Read View类。

所以,在该视图第一次查看事务时,会产生一个视图,这个视图就能看到当前sql系统正在活跃的事务。

具体如下图:
注意:事务ID是不断递增的,事务ID越小,说明该事务创建的越早。
在这里插入图片描述

  • 1.首先解析中间的事务,在快照时,当前系统正在活跃的事务,也就是已经begin但未commit的事务。
  • 2.已经提交的事务:在当前事务第一次进行快照读产生的Read View视图之前,已经commit的事务。
  • 3.快照后来的新事务:这些事务是在进行快照都之后,才开始begin活跃的事务。
  • 由于是已经形成Read View视图之后,才开始活跃的事务,所以在Read View列表中看不到。

在这里插入图片描述
解析这部分的意思:

  • 1.creator_trx_id就是创建该视图的事务ID,当该事务ID(creator_trx_id) == 版本链中的某个事务ID(DB_TRX_ID)时,说明我要看的事务ID,就是我本身。
  • 2.DB_TRX_ID < up_limit_id,说明我要查询的历史事务ID,小于当前我这个事务创建出来的视图ID(Read View),说明该事务是已经commit的,我应该要看到。

在这里插入图片描述
解析这部分的意思:
说明我当前要查询的事务ID,比我这个视图里面能看到的最大事务ID还要大,说明在我创建这个视图Read View的时候,你那个事务还没出生呢,或者你在我创建视图后才到来的。所以我不应该能看到你。

在这里插入图片描述
解析这部分的意思:
快照到的事务不一定连续。
如果要查询的事务ID不在Read View视图列表中,说明该事务已经提交,那就可以看到。
如果要查询的事务ID在Read View视图列表中,说明该事务同样是活跃事务还没commit,那么它的增删查改就不应该看到。

上面所提到的应不应该看到,指的是,应不应该出现在Read View视图里,这就像,假如我是大二学生,我应该要看到大四毕业学长的工作情况,但是当我大四的时候,我不可能也不应该看到大一的工作情况。

源码策略:
在这里插入图片描述

RR 和 RC 的本质区别

正是Read View生成时机的不同,从而造成RC,RR级别下快照读的结果的不同
在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View, 将当前系统活跃的其他事务记录起来此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用过快照读,那么之后的快照读使用的都是同一个Read View,所以对之后的修改不可见;

即RR级别下,快照读生成Read View时,Read View会记录此时所有其他活动事务的快照,这些事务的修改对于当前事务都是不可见的。而早于Read View创建的事务所做的修改均是可见。

而在RC级别下的,事务中,每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因。

总之在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。正是RC每次快照读,都会形成Read View,所以,RC才会有不可重复读问题。

简单说:RR和RC,RR:不更新Read View视图。
RC,每次进行快照读都会更新Read View视图。

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

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

相关文章

Recognition:基于HoG特征的最近邻分类器与SVM的人物检测器

实际运行结果&#xff1a; 上面的为最近邻分类器&#xff0c;其中红框表示最近邻搜索的预测结果。下方的为SVM&#xff1a;橙色框表示SVM的预测结果。其中&#xff0c;最红的框表示SVM预测的最高得分的预测结果。 使用经典图像处理的方法开发简单人物检测器&#xff0c;其大致…

P148--章节作业1

编辑 编辑 public class Main {public static void main(String args[]){double yxq100000;int cishu0;while(true) {if(yxq > 50000) {yxq yxq - yxq * 0.05;cishucishu1;}else if(yxq > 1000){yxq yxq - 1000;cishucishu1;}else{break;}}System.out.print(cishu);} …

【分支控制】(switch) 详解

switch分支结构 基本语法 switch (表达式){case 常量1: //当...语句块1;break; //跳出switchcase 常量2:语句块2;break;...case 常量n;语句块n;break;default:default语句块;break;}switch 关键字, 表示switch分支表达式, 对应一个值case 常量1: 当表达式的值等于常量1, 就执行…

详解Spring MVC

目录 1.什么是Spring Web MVC MVC定义 2.学习Spring MVC 建立连接 RequestMapping 注解介绍及使用 获取单个参数 获取多个参数 获取普通对象 获取JSON对象 获取基础URL参数 获取上传文件 获取Header 获取Cookie 获取Session 总结 1.什么是Spring Web MVC 官⽅对于…

转型先锋!G7易流的数字化到底有多牛?

在供应链全球一体化进程中&#xff0c;国内外局势的改变&#xff0c;使得物流行业运力供大于求趋势愈加明显&#xff0c;国内供应链参与者面对内外发展需求和激烈的市场竞争&#xff0c;需要打破同质化竞争的局面&#xff0c;提供具有特色的服务&#xff0c;形成专业、高效、灵…

深度学习500问——Chapter09:图像分割(3)

文章目录 9.8 PSPNet 9.9 DeepLab系列 9.9.1 DeepLabv1 9.9.2 DeepLabv2 9.9.3 DeeoLabv3 9.9.4 DeepLabv3 9.8 PSPNet 场景解析对于无限制的开放词汇和不同场景来说是具有挑战性的。本文使用文中的 pyramid pooling module 实现基于不同区域的上下文集成&#xff0c;提出了PS…

OrangePi AIpro初识及使用大模型GPT-Neo-1.3B测试

OrangePi AIpro介绍 1.1. 开发板简介 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板&#xff0c;其搭 载了昇腾AI 处理器&#xff0c;可提供8TOPS INT8 的计算能力&#xff0c;内存提供了8GB 和16GB 两种版本。可以实现图像、视频等多种数据分析与推理…

[xx点评完结]——白马点评完整代码+rabbitmq实现异步下单+资料,免费

项目所有功能已测&#xff0c;均可以跑通&#xff0c;Jmeter和RabbitMQ也都测了。 项目源码:dianpinghui: 仿黑马点评项目 资料: https://pan.baidu.com/s/1kTCn9PxgeIey90WgM4KRqA?pwdn66b 对佬有帮助可以给个star哈&#xff0c;感谢&#x1f339;&#x1f339;&#x1f3…

OpenHarmony 实战开发——内核IPC机制数据结构解析

一、前言 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;目标是面向全场景、全连接、全智能时代&#xff0c;基于开源的方式&#xff0c;搭建一个…

【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作)

作品展示 背景需求 【教学类-58-05】黑白三角拼图05&#xff08;2-10宫格&#xff0c;每个宫格随机1张-6张&#xff0c;带空格纸&#xff0c;1页3张黑白3张白卡&#xff09;-CSDN博客文章浏览阅读343次&#xff0c;点赞10次&#xff0c;收藏6次。【教学类-58-05】黑白三角拼图…

玄机平台应急响应—webshell查杀

1、前言 这篇文章说一下应急响应的内容&#xff0c;webshell查杀呢是应急响应的一部分。那么什么是应急响应呢&#xff0c;所谓的应急响应指的是&#xff0c;当网站突然出现异常情况或者漏洞时&#xff0c;能够马上根据实际问题进行分析&#xff0c;然后及时解决问题。 2、应…

新增长100人研讨会:台州制造业企业共探数字驱动下的业绩增长策略

2024年5月17日&#xff0c;纷享销客联合鑫磊压缩机&#xff0c;在台州举办了一场主题为“数字化驱动下的业绩增长策略”的研讨会。本次会议汇聚台州多家制造行业的10余位数字化管理者&#xff0c;共同探讨在数字化转型浪潮中&#xff0c;制造业如何实现业绩的持续增长。 鑫磊压…

计算机二级Access操作题总结——基本操作

基础操作题 设置主键 例&#xff1a;将“线路”表中的“线路ID”字段设置为主键 ①右键单击“线路”表&#xff1b; ②单击【设计视图】&#xff1b; ③鼠标指到表的第一行→“线路ID”处&#xff0c;右键单击&#xff1b; ④单击【主键】 设置有效性规则 例&#xff1a;设…

【Linux】Linux基本指令1

1.软件&#xff0c;OS&#xff0c;驱动 我们看看计算机的结构层次 1.1.操作系统 操作系统是一款做 软硬件管理 的软件 操作系统&#xff08;计算机管理控制程序&#xff09;_百度百科 (baidu.com) 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&a…

【全开源】景区手绘地图导览系统源码(ThinkPHP+FastAdmin)

一款基于ThinkPHPFastAdmin开发多地图手绘地图导览系统(仅支持H5)&#xff0c;景区升4A5A必备系统&#xff0c;高级版支持全景。 ​打造个性化游览新体验 一、引言&#xff1a;景区导览系统的革新 在旅游业蓬勃发展的今天&#xff0c;景区导览系统成为了提升游客体验的关键。…

java方法负载问题

先介绍一下方法的重载 下面是例子 方法名都为sum而形参是不同的 记住&#xff01; 是否为重载关系 1在同一个类里面 2形参不同&#xff08;与返回值无关&#xff09; 3方法名一样 第一个图为什么错&#xff1f; 答案&#xff1a;虽然在同一个类里面&#xff0c;并且方法名…

深度学习设计模式之组合模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 组合模式是将对象组合成树形结构来表现"整体/部分"层次结构&#xff0c;可以更好的实现管理操作。 一、介绍 组合设计模式又叫部分整体模式&#xff0c;将…

Kali : 安装Google Chrome 浏览器和ChromeDriver

目录 一、安装Google Chrome 浏览器 1、下载Google Chrome 2、安装Chrome 3、安装依赖包 二、安装ChromeDriver 1、查看Chrome版本 ​2、下载ChromeDriver 3、解压下载包 4、设置全局访问 5、赋予可执行权限 6、验证chromedriver 7、程序测试 一、安装Google Chrom…

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码&#xff1a;打造高效便捷的预定体验 一、引言&#xff1a;数字化预定时代的来临 …

【多态】(超级详细!)

【多态】&#xff08;超级详细&#xff01;&#xff09; 前言一、 多态的概念二、重写1. 方法重写的规则2. 重写和重载的区别 三、多态实现的条件四、 向上转型五、动态绑定 前言 面向对象的三大特征&#xff1a;封装性、继承性、多态性。 extends继承或者implements实现&…