xiaolin coding 图解 MySQL笔记——事务篇

1. 事务隔离级别是怎么实现的?

数据库中的**事务(Transaction)**先开启,然后等所有数据库操作执行完成后,才提交事务,对于已经提交的事务来说,该事务对数据库所做的修改将永久生效,如果中途发生中断或错误,那么该事务期间对数据库所做的修改将会被回滚到没执行该事务之前的状态。

2. 事务有哪些特性?

事务是由 MySQL 的引擎来实现的,实现事务必须遵守 4 个特性:

  • 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务再执行过程中发生错误,会被回滚到事务开始前的状态。
  • 一致性(Consistency):事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
  • 隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行导致的数据不一致。
  • 持久性(Durability):事务处理结束后,对数据的修改就是永久的。

InnoDB 引擎通过 redo log(重做日志)保证持久性;通过 undo log(回滚日志)保证原子性;通过 MVCC(多版本并发控制)或锁机制来保证隔离性;一致性是通过持久性+原子性+隔离性来保证。

3. 并行事务会引发什么问题?

MySQL 服务端允许多个客户端连接,这意味着 MySQL 会出现同时处理多个事务的情况。

那么在同时处理多个事务的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题

脏读

如果一个事务【读到】了另一个【未提交事务修改过的数据】,就意味着发生了【脏读】现象
比如 A,B 两个事务同时处理,A 事务中间对数据进行了更新,此时 B 正好要读取这个数据,读到了 A 更新后的数据,即使 A 并没有提交。如果 A 发生了回滚,那么 B 读到的就是过期的数据

不可重复读

在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了【不可重复读】
比如 A,B 事务,A 事务先读取了某数据,然后 B 更新了这条数据并提交了事务,那么 A 再次读取此数据的时候,数据不一致。

幻读

在一个事务内多次查询某个符合查询条件的【记录数量】,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了【幻读】
比如 A,B 事务,A 事务查询了一个记录范围,B 也查询了相同的范围,但 A 接着插入了一个范围内的记录并提交了事务,B 再次查询时记录和前一次不一样。

4. 事务的隔离级别有哪些?

为了解决【脏读、不可重复读、幻读】的现象,严重性排序为 脏读 > 不可重复读 > 幻读。

SQL 标准提出了四种隔离级别来规避这些现象,隔离级别越高,性能效率就越低:

  • 读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;可能发生【脏读,不可重复读,幻读】
  • 读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;可能发生【不可重复读,幻读】
  • 可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;可能发生【幻读】
  • 串行化(serializable);会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;

MySQL InnoDB 引擎的默认隔离级别是可重复读,但也能很大程度上避免幻读现象:针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为即使中途有其他事务插入了一条数据,这个隔离级别下事务执行看到的数据一直跟事务启动时看到的数据一致,所以查询不到新增的数据;针对当前读(select…for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行语句时,加上锁,如果在锁范围内插入了记录,那么插入语句会阻塞。当前读的语句会锁定查询结果中的行,防止其他事务的修改,MVCC+next-key lock能很大程度上保证了不会幻读,但仍可能有特殊情况

5. Read View 在 MVCC 里是如何工作的?

【读提交】和【可重复读】隔离级别的事务是通过 Read View 来实现的,它们的区别在于创建 Read View 的时机不同,Read View 可以看成一个数据快照,定格某一时刻的数据。【读提交】是在【每个语句执行前】都会重新生成一个 Read View,而【可重复读】是【启动事务时】生成一个 Read View,然后整个事务期间都在用这个 Read View。

Read View 有四个重要的字段:

  • m_ids:指的是在创建 Read View 时,当前数据库中【活跃事务】的事务 id 列表,活跃事务是指启动了但还没提交的事务
  • min_trx_id:指的是在创建 Read View 时,当前数据库中【活跃事务】中事务 id 最小的事务,也就是 m_ids 的最小值。
  • max_trx_id:这个不是 m_ids 的最大值,而是创建 Read View 时当前数据库应该给下一个事务的 id 值,也就是最大的 m_ids + 1。
  • creator_trx_id:指的是创建该 Read View 的事务的事务 id
    在这里插入图片描述
    聚簇索引记录有两个隐藏列:
  • trx_id,当一个事务对某条聚簇索引记录进行改动时,就会把该事务的事务 id 记录在 trx_id 隐藏列里
  • roll_pointer,每次对某条聚簇索引记录进行改动时,都会把旧版本的记录写入到 undo 日志中,然后这个隐藏列是个指针,指向每一个旧版本记录,于是就可以通过它找到修改前的记录。
    在这里插入图片描述
    那么创建 Read View 后,记录中的 trx_id 可以划分为以下情况:
    在这里插入图片描述
    一个事务去访问记录的时候,除了自己的更新记录总是可见,还有:
  • 如果记录的 trx_id 值小于 Read View 中的 min_trx_id,表示这个版本的记录在创建 Read View 之前提交的事务生成的,所以对当前事务可见
  • 如果 trx_id 大于等于 Read View 的 max_trx_id,说明版本记录在 Read View 之后启动的事务生成的,所以不可见
  • 如果在之间,则需要判断 trx_id 是否在 m_ids 列表中,如果在,代表依然活跃,所以不可见,如果不在,所以可见

这种通过【版本链】来控制并发事务访问同一个记录时的行为就叫 MVCC(多版本并发控制)

6. 可重复读是如何工作的?

在这里插入图片描述
事务 B 的 id 为 52,此时它的活跃事务 id 列表是 51,52,然后第一次读的时候发现 trx_id 为 50,所以可见,在事务 A 更改后,事务 B 再次读,发现 trx_id 为 51,在活跃 id 列表的最大最小值(min_trx_id,max_trx_id)之间,所以查看事务 A id 51 是否在 m_ids 范围内,发现在,说明还未提交,所以 B 沿着 undo log 的链条找到第一条 trx_id 小于 B 的 min_trx_id 的旧版本的记录。这样就实现了【可重复读】

7. 读提交是如何工作的?

读提交隔离级别每次读取数据时,都会生成一个新的 Read View,所以如果事务 A id 是 51,B 是 52,B 在 第一次读的时候 min_trx_id 是 51,而第二次读的时候因为 A 已经提交了,所以 min_trx_id 是 52,这个时候 51 小于 52,所以 A 修改过的数据版本对 B 是可见的。

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

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

相关文章

掌握 Spring Boot 中的缓存:技术和最佳实践

缓存是一种用于将经常访问的数据临时存储在更快的存储层(通常在内存中)中的技术,以便可以更快地满足未来对该数据的请求,从而提高应用程序的性能和效率。在 Spring Boot 中,缓存是一种简单而强大的方法,可以…

408——数据结构(持续更新)

文章目录 一、绪论1.1 相关概念1.2 数据结构三要素1.3 相关习题1.4 复杂度1.4.1 时间复杂度1.4.2 复杂度相关习题 二、线性表 一、绪论 1.1 相关概念 数据:数据是信息的载体,所有能被输入到计算机中,且能被计算机处理的符号的集合。如图片、…

深入浅出:开发者如何快速上手Web3生态系统

Web3作为互联网的未来发展方向,正在逐步改变传统互联网架构,推动去中心化技术的发展。对于开发者而言,Web3代表着一个充满机遇与挑战的新领域,学习和掌握Web3的基本技术和工具,将为未来的项目开发提供强大的支持。那么…

C++学习日记---第16天

笔记复习 1.C对象模型 在C中,类内的成员变量和成员函数分开存储 我们知道,C中的成员变量和成员函数均可分为两种,一种是普通的,一种是静态的,对于静态成员变量和静态成员函数,我们知道他们不属于类的对象…

Leetcode 每日一题 205.同构字符串

目录 问题描述 过题图片 示例 解决方案 代码实现 题目链接 总结 问题描述 给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t,那么这两个字符串是同构的。具体来说,每个出现的字符都应当映射…

C# 集合(Collection)

文章目录 前言一、动态数组(ArrayList)二、哈希表(Hashtable)三、排序列表(SortedList)四、堆栈(Stack)五、队列(Queue)六、点阵列(BitArray&…

2.5 特征降维(机器学习)

2.5 特征降维 2.5.1 降维 降维:是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。 ndarray 维数 嵌套的层数 0维 标量 1维 向量 2维 矩阵 3维 n维 二维数组 降低的维度…

【小白学机器学习41】如何从正态分布的总体中去抽样?比较不同的取样方差的差别

目录 1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本 1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本,模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…

框架5:SpringBoot 2 - 核心功能

SpringBoot2 - 基础入门【一 ~ 五】,详见: 六、配置文件 6.1 properties文件格式 同之前的用法。 6.2 yaml文件格式【推荐】 YAML本意:“YAML”不是一种标记语言。但在开发中,实际把它理解为:“Yet Another Markup Lan…

行为型设计模式之《责任链模式》实践

定义 责任链模式(Chain Of Responsibility Pattern)顾名思义,就是为请求创建一条处理链路,链路上的每个处理器都判断是否可以处理请求,如果不能处理则往后走,依次从链头走到链尾,直到有处理器可…

Vue前端开发-路由树配置

一个配置路由的文件由导入路由模块、创建路由对象和导出路由对象三个部分组成,在创建路由对象时,需要构建路由数组,路由数组中包括一级、二级和多级路由结构,因此,这种结构的路由配置,又称为路由树配置。 …

2.mysql 中一条更新语句的执行流程是怎样的呢?

前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。 相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条更新语句的执行流程又…

JavaScript根据数据生成柱形图

分析需求 // 定义一个数组来存储四个季度的数据 dataArray = []// 循环4次,获取用户输入的数据并存储到数组中 for i from 0 to 3// 获取用户输入的数据inputData = 获取用户输入的第(i + 1)季度的数据// 将数据存入数组dataArray[i] = inputData// 遍历数组,根据数据生成柱…

实验13 使用预训练resnet18实现CIFAR-10分类

1.数据预处理 首先利用函数transforms.Compose定义了一个预处理函数transform,里面定义了两种操作,一个是将图像转换为Tensor,一个是对图像进行标准化。然后利用函数torchvision.datasets.CIFAR10下载数据集,这个函数有四个常见的…

【AI系统】代数简化

代数简化 代数简化(Algebraic Reduced)是一种从数学上来指导我们优化计算图的方法。其目的是利用交换率、结合律等规律调整图中算子的执行顺序,或者删除不必要的算子,以提高图整体的计算效率。 代数化简可以通过子图替换的方式完…

多人聊天室项目 BIO模型实现

BIO模型聊天室项目大体设计 BIO编程模型 Acceptor是服务器端负责监听具体端口的Socket每有一个客户端Client连接到服务器端,Acceptor就创建一个新的线程Handler来处理客户端发送的消息每一个客户端都有一个唯一的Handler来对应处理其事务为保证线程安全&#xff0c…

腾讯云平台 - Stable Diffusion WebUI 下载模型

1)进入控制台,点击算力连接 》 JupyterLab 2)进入模型目录(双击) 3)上传模型 例如:我要上传大模型

夜神模拟器+Charles+postern+Mgisk+TrustMeAlready实现抓包

[实测有用]夜神模拟器CharlesposternMgiskTrustMeAlready实现抓包 PS:此贴仅做为技术交流,禁止非法用途。 1.初始化条件 A.安装MUMU模拟器安卓12版本 B.按图示选择,设置好代理端口8889 C.查看本机IP地址 D.导出证书,安装配置,暂时保存…

【closerAI ComfyUI】物体转移术之图案转移,Flux三重控制万物一致性生图,实现LOGO和图案的精准迁移

更多AI前沿科技资讯,请关注我们:closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 closerAIGCcloserAI,一个深入探索前沿人工智能与AIGC领域的资讯平台,我们旨在让AIGC渗入我们的工作与生活中,让我们一起探索AIGC的无限可能性! 【closerAI ComfyUI】物体转移术之图…

新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议

为推进广东省加快发展新质生产力,贯彻落实“百县千镇万村高质量发展工程”,推动韶关市新丰县智能网联新能源汽车、低空经济与数字技术的创新与发展,充分发挥湾区汽车产业链头部企业的带动作用。韶关市指导、珠三角湾区智能网联新能源汽车产业…