MySQL八股学习记录4事务的实现from小林coding

news2025/2/3 7:18:46

MySQL八股学习记录4事务的实现from小林coding

  • 事务的概念与特性
  • 并行事务引发的问题
    • 脏读
    • 不可重复读
    • 幻读
  • MySQL的应对策略
    • InnoDB引擎可重复读详解
      • ReadView在MVCC中的工作方式
      • 两种隔离级别通过MVCC实现
      • 幻读被完全解决了吗

事务的概念与特性

概念:一个操作要么执行成功,要么回滚到执行前的状态
特性:ACID
原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成
一致性(Consistency):事务操作前和操作后,满足用户层的约束性
隔离性(Isolation):数据库允许多个事务同时对数据进行读写,隔离性可以保证多个事务同时读写的数据一致性
持久性(Durability):事务结束后,对事务的修改就是永久的,即使系统故障也不会丢失
事务四大特性的保证
持久性:redo log(重做日志)
原子性:undo log(回滚日志)
隔离性:MVCC(多版本并发控制)或锁机制实现的
一致性:通过持久 + 原子性 + 隔离性 保证

并行事务引发的问题

脏读

一个事务读到另一个未提交事务修改后的数据称为脏读
上图
脏读
场景:若A发生了回滚,那么B得到的数据是错误的数据

不可重复读

一个事务内对同一个数据的两次读取,读取到的数据不相同,称为不可重复读
不可重复读
场景:若A读取了数据,并且B提交了事务,那么A再次读取的数据就会与A上次读到的数据不一样

幻读

一个事务内多次查询Count,若两次的记录数量并不相同,那么发生了幻读现象
幻读
场景:事务B查询数据,之后事务A插入一条数据,并且提交,这个时候B再去读数据就会发现两次读取到的条数不一致,就像发生了幻觉一样

MySQL的应对策略

由于上述问题的存在,MySQL提出了四种隔离级别分别是

  • 读未提交:一个事务未提交,他的结果就能被其他事务看到
  • 读已提交:一个事务提交后,结果才能被其他事务看到
  • 可重复读:一个事务过程中看到的数据,与这个事务启动时看到的数据是一样的,InnoDB的默认隔离级别
  • 串行化:对记录加上读写锁,多个事务读写必串行
    在这里插入图片描述

InnoDB引擎可重复读详解

InnoDB引擎很大程度上的避免了幻读现象但并未完全避免方案有两种

  • 针对快照读(普通select),MVCC方式解决幻读:
  • 针对当前读(除了普通select都是这个读),next-key lock(记录锁+间隔锁)方式解决幻读

对于读提交和可重复读隔离级别的事务来说,通过Read View实现,读提交与可重复读的快照时间不同,可重复读是在每个事务之前生成一个快照,读提交是在每个语句前进行快照操作

ReadView在MVCC中的工作方式

ReadView有关的四个字段
聚簇记录中还有两个隐藏列

在这里插入图片描述
其中

  • trx_id:改动该数据的事务ID
  • roll_pointer:改变记录后,旧版本的记录将会被写入到undo日志中,通过该指针能找到旧版本的记录
    创建Read View后,记录中的trx_id可以划分成三种情况
    在这里插入图片描述
    一个事务访问记录时,自己更新的记录总是可见,其余情况下有
  • 如果记录的trx_id小于ReadView中的min_trx_id,那么表示该事务在创建ReadView之前生成,那么对当前事务可见
  • 如果记录的trx_id大于等于max_trx_id,那么这个版本的记录在创建ReadView后才生成,那么对该版本记录不可见,通过undolog去查找
  • 如果trx_id在ReadView的min_trx和max_trx之间,需要判断trx_id是否在m_ids列表中,若在,那么该版本的事务依然活跃,那么不可见,若不在,则已被提交,该版本的记录对当前事务可见

两种隔离级别通过MVCC实现

  • 可重复读是事务开始时就快照,整个事务期间都使用这个快照
  • 读已提交则是每次查询数据前生成新的快照

幻读被完全解决了吗

并没有,一种场景如下,事务A先查询一个数据,然后事务B插入一个数据,之后A再对该数据更新(虽然这样的操作很违和),这样之后A就能读B插入的数据,正因为这种特殊情况的存在,所以并不能认为MVCC解决了幻读

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

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

相关文章

Matplotlib subplots()函数详解

matplotlib.pyplot模块提供了一个 subplots() 函数,它的使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布…

面试题揭秘:Spring Boot 自动配置原理是什么?

大家好,我是你们的小米。在过去的几年里,Spring Boot已经成为了Java开发领域中最受欢迎的框架之一。它以其简化的开发方式和强大的功能而闻名于世。今天,我们来揭秘一个常见的面试题:Spring Boot自动配置原理是什么?让…

针对汽配企业的生产难点,提出MES管理系统解决方案

随着汽车产业的快速发展,汽配企业面临着越来越多的生产难点,如生产过程不透明、效率低下、质量控制困难等。为了应对这些挑战,引入MES生产管理系统成为了一种有效的解决方案。本文将探讨MES生产管理系统在汽配企业中的应用,以及它…

【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码

【江西省研究生数学建模竞赛】题目之一 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MA…

如何顺势而为,让ChatGPT为教育所用?

恐惧和回避无法阻挡科技的浪潮,教育与AI的深度融合时代已经到来,如何把AI当做工具,把其成为教育的机会而非威胁,是教育体系未来不得不得面对的新变化。 接受ChatGPT作为一种教学辅助工具,成为教师的朋友或者帮手&…

备战秋招010(20230717)

文章目录 前言一、基础1、网络模型01、OSI 七层02、TCP/IP 四层04、Linux 网络协议栈05、问题 2、常见的网络协议01、应用层02、传输层03、网络层 3、输入网址到网页显示过程01、基础02、DNS 解析03、URL 和 URI 二、HTTP1、基础01、概念02、状态码03、无状态 2、Get 和 Post01…

element-ui select数据回显显示数字的问题 el-select校验失效出现阿拉伯数字问题

初始化参数 return {fields: [{"title":"景区","id":0},{"title":"酒店","id":1}],evaluates: [{"title":"好评","id":0},{"title":"中评","id":1…

【Linux】- Linux 磁盘分区、挂载

Linux 磁盘分区、挂载 1.1 Linux 分区1.2 硬盘说明1.3 磁盘情况查询 1.1 Linux 分区 原理介绍 Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系…

SAP AES encrypt

加密算法简介: 加密技术通常分为两大类:"对称式"和"非对称式"。 对称性加密算法:对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法…

【近场社交项目】数据库系统期末设计——逻辑设计部分

【近场社交项目】数据库系统期末设计——逻辑设计部分😎 前言🙌3.2逻辑设计1、各个表的二维表:2. 用户信息ER图转换为逻辑和关系模型:3. 用户进行下单业务的ER图转换为逻辑关系模型4. 用户充值会员业务ER图转换为逻辑关系模型5. 用…

springboot实现全局异常捕获

导言: 为什么要做异常处理: 原因有三: 1、将系统产生的全部异常统一捕获处理。 2、自定义异常需要由全局异常来捕获。 3、JSR303规范的validator参数校验器、参数校验不通过、本身无法使用try…catch 其实对于前后端分离的项目做异常处理…

ROS:导航功能详解

目录 一、导航简介1.1导航概念1.2导航作用1.3导航模块简介1.3.1全局地图1.3.2自身定位1.3.3路径规划1.3.4运动控制1.3.5环境感知 1.4导航条件1.4.1硬件1.4.2软件 二、坐标系2.1坐标系简介2.2坐标系特点2.3坐标系变换 三、导航功能实现3.1SLAM建图3.1.1gmapping简介3.1.2gmappin…

【VUE】解决VU2项目图片视频加载缓慢/首屏加载白屏的问题

1 问题描述 前端项目中,有时候会出现图片视频加载缓慢、首屏加载白屏的问题 之前写了一篇在VU3项目中的解决方案, 现在讲一下在 Vue2 项目中的解决方法,方法思路都差不多,在代码示例上会有一些小差别 2 原因分析 通常是由以下原因…

辅助驾驶功能开发-功能规范篇(22)-6-L2级辅助驾驶方案功能规范

1.3.6 ELK 系统功能定义 ELK全称Emergency Lane Keeping,即紧急车道保持。当车辆与道路边界护栏(包含隔离带护栏、路锥、水马) 有碰撞危险或当车辆正偏出道路边沿且存在“对向来车”或“后向来车”与本车有碰撞风险时,通过给与转向…

Redis源码篇- SDS

Redis对于String类型,底层使用的是SDS(简单动态字符串),而不是常规的C语言的字符数组 。 通常在C中,定义一个字符串,方式是通过字符数组表示,同时结尾使用/0表示结束:char [] &quo…

C语言 与 C++ 通讯录对比实现(附带源码)

目录 1.通讯录的基本框架 C语言版 C版 2.增加联系人 C语言版 C版 3.删除联系人 C语言版 C版 4.查找与打印联系人 C语言版 C版 5.修改联系人 C语言版 C版 6.排序联系人 C语言版 C版 7.其他 8.总结 本文章将对C语言、C版本的通讯录进行对比实现。其中C版本引入大量C语言没有的特性…

第 5 章 Spark Shuffle 解析

第 5 章 Spark Shuffle 解析 5.1 Shuffle 的核心要点1. 数据分区:2.数据传输:3. 数据排序:4.数据聚合:5. 数据重分发:6.数据持久化:5.1.1 ShuffleMapStage 与 ResultStage 5.2 HashShuffle 解析5.2.1 未优化…

KUKA机器人_外部安全条件不满足时,如何操作机器人的方法

KUKA机器人_外部安全条件不满足时,如何操作机器人的方法 如果大家在做项目时,控制系统尚未完成,外部紧急停止等安全条件尚未满足时,但是此时想操作或移动机器人,有办法吗? 答案是有。 具体的方法可参考以…

驾驶证——科目一笔记(二)

知识点1:通行规定 有加速(x) 各种礼让(√) 减速慢行、减速靠右、减速或停车、停车避让(√) 不用减速慢行、无需减速、不必减速(x) 不得(√) …

【文档模板】产品故障分析报告

今天和大家分享产品故障分析报告的文档模板。产品故障分析报告是一份文件,通常由技术团队、工程师或相关专业人员编写,用于详细描述和分析出现在系统、设备、产品或服务中的故障原因和根本原因。这些报告旨在对故障进行系统性的研究,以便团队…