【面试八股总结】MySQL事务:事务特性、事务并行、事务的隔离级别

参考资料:小林coding

一、事务的特性ACID

  • 原子性(Atomicity)

        一个事务是一个不可分割的工作单位,事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。原子性是通过 undo log(回滚日志) 来保证的。

  • 一致性(Consistency)

        事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。

  • 隔离性(Isolation)

        数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。多个事务并发执行时,每个事务都看不到其他事务的中间状态。每个事务都应该感觉就像它是唯⼀在数据库上运行的事务⼀样。隔离性是通过 MVCC(多版本并发控制)锁机制来保证的。

  • 持久性(Durability)

        ⼀旦事务被提交,其结果将永久保存在数据库中,即使系统发生故障。即使系统发生崩溃,事务的结果也不应该丢失,持久性是通过 redo log (重做日志)来保证的。

二、脏读、不可重复读、幻读

      并行事务是指多个事务同时执⾏,这可以提高数据库系统的性能和吞吐量。

1. 脏读:读到其他事务未提交的数据

        如果一个事务读到了另一个未提交事务修改过的数据,就意味着发生了「脏读」现象。如果另⼀个事务后来回滚,读取的数据就是无效的。

2. 不可重复读:前后读取的数据不⼀致

        在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了不可重复读现象。在事务执⾏期间其他事务可能修改了数据。

3. 幻读:前后读取的记录数量不⼀致

        在一个事务内多次查询某个符合查询条件的记录数量,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了幻读现象。在事务执⾏期间其他事务可能增加或删除了数据。

        脏读、不可重复读、幻读的现象会对事务的一致性产生不同程度的影响。严重性排序如下:

三、事务的隔离级别

        SQL 标准提出了四种隔离级别来规避脏读、不可重复读、幻读的现象,隔离级别越高,性能效率就越低,这四个隔离级别如下:

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

        隔离水平高低排序如下:

         针对不同的隔离级别,并发事务时可能发生的现象也会不同。

  • 在「读未提交」隔离级别下,可能发生脏读、不可重复读和幻读现象;
  • 在「读提交」隔离级别下,可能发生不可重复读和幻读现象,但是不可能发生脏读现象;
  • 在「可重复读」隔离级别下,可能发生幻读现象,但是不可能脏读和不可重复读现象;
  • 在「串行化」隔离级别下,脏读、不可重复读和幻读现象都不可能会发生。

        MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很⼤程度上可以避免幻读现象。解决的方案有两种:

  • 针对快照读(普通 select 语句),是通过 MVCC方式解决了幻读
  • 针对当前读:(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读, 因为当执⾏ select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

隔离级别的实现

  • 读未提交

         可以读到未提交事务修改的数据,直接读取最新的数据;

  • 串行化

        通过加读写锁的方式来避免并行访问;

  • 读提交 和 可重复读

        通过 Read View 实现,区别在于创建 Read View 的时机不同,可以把 Read View 理解成一个数据快照。读提交是在每个语句执行前都会重新生成一个 Read View,而可重复读是启动事务时生成一个 Read View,然后整个事务期间都在用这个 Read View。

Read View 在 MVCC 里如何工作的?

Read View 有四个重要的字段:

  • m_ids :指的是在创建 Read View 时,当前数据库中「活跃事务」的事务 id 列表,注意是一个列表,“活跃事务”指的就是,启动了但还没提交的事务
  • min_trx_id :指的是在创建 Read View 时,当前数据库中「活跃事务」中事务 id 最小的事务,也就是 m_ids 的最小值。
  • max_trx_id :这个并不是 m_ids 的最大值,而是创建 Read View 时当前数据库中应该给下一个事务的 id 值,也就是全局事务中最大的事务 id 值 + 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 值在 Read View 的 min_trx_id 和 max_trx_id 之间,需要判断 trx_id 是否在 m_ids 列表中:
    • 如果记录的 trx_id  m_ids 列表中,表示生成该版本记录的活跃事务依然活跃着(还没提交事务),所以该版本的记录对当前事务不可见
    • 如果记录的 trx_id 不在 m_ids列表中,表示生成该版本记录的活跃事务已经被提交,所以该版本的记录对当前事务可见

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

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

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

相关文章

Arm发布Cortex X925、A725、A520,Armv9.2架构

随着半导体行业的不断发展,Arm 通过突破技术界限,为终端用户提供尖端解决方案,在核心和 IP 架构创新方面处于领先地位,尤其是在移动领域。2024 年,Arm 的年度战略进步重点是增强去年的 Armv9.2 架构,并带来…

Windows系统安装openvino(2024.1.0)

一、openvino下载: 下载地址:下载英特尔发行版 OpenVINO 工具套件 (intel.cn) 下载完之后将压缩包解压,然后重命名文件夹为openvino_2024.1.0。 二、环境配置 以python环境为例:(建议使用moniconda虚拟环境来安装&am…

鸿蒙ArkTS声明式开发:跨平台支持列表【背景设置】 通用属性

背景设置 设置组件的背景样式。 说明: 开发前请熟悉鸿蒙开发指导文档: gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版…

【免费Web系列】JavaWeb实战项目案例五

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 新增员工 前面我们已经实现了员工信息的条件分页查询。 那今天我们要实现的是新增员工的功能实现,页面原型如下: ​ 首先我们先完成"新增员工"的功能开发&#xff0…

ODBC访问达梦数据库Ubuntu18.04 x86-x64(亲测有效)

ODBC访问达梦数据库Ubuntu18.04 x86-x64 第1步:安装unixodbc驱动,使用下面命令。第2步:拷贝已经安装好的达梦数据库驱动程序第3步:配置ODBC必要的参数文件,如下图第4步:设置环境变量第5步:连接测试 说明&am…

Github单个文件或者单个文件夹下载插件

有时候我们在github上备份了一些资料,比如pdf,ppt,md之类的,需要用到的时候只要某个文件即可,又不要把整个仓库的zip包下载下来,毕竟有时文件太多,下载慢,我们也不需要所有资料,那么就可以使用到…

docker安装Mysql5.7版本

首先Linux系统已经安装好了docker应用。 1.搜索镜像 docker search mysql 2.拉取5.7的镜像 总之,选starts最多的那个就对了。 docker pull mysql:5.7 ~ docker pull mysql:5.7 5.7: Pulling from library/mysql fc7181108d40: Downloading [============> …

C语言数据结构(超详细讲解)| 二叉树的实现

二叉树 引言 在计算机科学中,数据结构是算法设计的基石,而二叉树(Binary Tree)作为一种基础且广泛应用的数据结构,具有重要的地位。无论是在数据库索引、内存管理,还是在编译器实现中,二叉树都…

Github 如何配置 PNPM 的 CI 环境

最近出于兴趣在写一个前端框架 echox,然后在 Github 上给它配置了最简单的 CI 环境,这里简单记录一下。 特殊目录 首先需要在项目根目录里面创建 Github 仓库中的一个特殊目录:.github/workflows,用于存放 Github Actions 的工作…

MyBatis基础理解教程,详细分步基础查询表数据练习(通俗易懂、实时更新)

一、MyBatis是什么 MyBatis 是一个持久层框架,简化JDBC开发,它提供了一个从 Java 应用程序到 SQL 数据库的桥梁,用于数据的存储、检索和映射。MyBatis 支持基本的 SQL 操作、高级映射特性以及与 Maven 等构建工具的集成。 二、持久层是什么…

matlab GUI界面设计

【实验内容】 用MATLAB的GUI程序设计一个具备图像边缘检测功能的用户界面,该设计程序有以下基本功能: (1)图像的读取和保存。 (2)设计图形用户界面,让用户对图像进行彩色图像到灰度图像的转换…

力扣2965. 找出缺失和重复的数字

题目: 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n] 范围内。除了 a 出现两次,b 缺失 之外,每个整数都恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从 0 开始…

【面结构光三维重建】0.基于openCV实现相机的标定

1.标定结果 2.相机标定原理 相机标定是计算机视觉和机器视觉领域中的重要技术,用于确定相机成像的几何关系和畸变特性,以提高成像的精度和稳定性。该技术广泛应用于三维重建、机器人视觉、自动驾驶等领域。 世界坐标系:由用户定义的三维世界坐标系,描述物体和相机在真实世…

C++的第一道门坎:类与对象(三)

目录 一.再谈构造函数 1.1构造函数体赋值 1.2初始化列表 1.3explicit关键字 二.static成员 2.1概念 ​编辑 2.2特性 三.友元 3.1友元函数 3.2友元类 4.内部类 一.再谈构造函数 1.1构造函数体赋值 class Date { public:Date(int year,int month,int day){_year ye…

32. 【Java教程】集合

在前面的小节中,我们学习了数组,本小节学习的集合同样用于存放一组数据,我们将学习什么是集合、集合的应用场景 ,在应用场景部分我们将对比 Java 数组与集合的区别,还将系统介绍 Java 集合的架构,也将结合实…

千里之堤,溃于蚁穴

今天写代码的时候找错误找得好辛苦,我发现看似两段相同的代码却有不同的运行效果,真是感慨啊,千里之堤,溃于蚁穴。我比对好几遍这两段代码,找了半天并没有发现有什么不同之处。 最后去网上搜索工具,最后找到…

echart扩展插件词云echarts-wordcloud

echart扩展插件词云echarts-wordcloud 一、效果图二、主要代码 一、效果图 二、主要代码 // 安装插件 npm i echarts-wordcloud -Simport * as echarts from echarts; import echarts-wordcloud; //下载插件echarts-wordcloud import wordcloudBg from /components/wordcloudB…

Qt图像处理技术十:得到QImage图像的高斯模糊

效果图 参数为5 参数为20 原理 高斯模糊使用正态分布来分配周围像素的权重。具体来说,距离中心点越近的像素对最终结果的影响越大,权重也越高;随着距离的增加,权重逐渐减小。 这种权重分配方式确保了图像在模糊处理时&#xff0…

App自动化测试_Python+Appium使用手册

一、Appium的介绍 Appium是一款开源的自动化测试工具,支持模拟器和真机上的原生应用、混合应用、Web应用;基于Selenium二次开发,Appium支持Selenium WebDriver支持的所有语言(java、 Object-C 、 JavaScript 、p hp、 Python等&am…

鸿蒙OS开发:【一次开发,多端部署】(分栏控件)

一多分栏控件 介绍 本示例分别展示了多场景下,一多分栏控件的响应式变化效果。 本示例分别用到了[SideBarContainer]组件与[Navigation]组件,对应使用场景如下: ABC:即SideBarContainer组件组合Navigation组件AC:S…