mysql:事务的特性ACID、并发事务(脏读、不可重复读、幻读、如何解决、隔离级别)、undo log和redo log的区别、相关面试题和答案

news2024/11/27 4:32:38

事务是一组操作的集合,它会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

事务的特性(ACID)

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

并发事务带来的问题

在这里插入图片描述

脏读

一个事务读到另外一个事务还没有提交的数据,称为脏读。
在这里插入图片描述
譬如上图,事务A准备查询并更新了id=1的数据,此时事务A还没有提交时,就有事务B来查询该id=1的数据且成功查到,这叫脏读。

不可重复读

一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
在这里插入图片描述
譬如上图,一个事务A先是查询了id=1的数据得到值为x的结果,接着去进行事务的其他操作,此时事务B对id=1的数据进行修改,值变为y。之后事务A再去查询该id=1的数据,发现值为y。事务A前后读取同一条记录,但值不相同,这叫不可重复读。

幻读

在解决了不可重复读的基础上,即一个事务内先后查询同一条数据的结果应该一致的基础上,一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”。
在这里插入图片描述
譬如上图,事务A一开始先查询数据库中id=1的数据,发现不存在。此时事务B刚好往数据库中添加了id=1的数据。此时事务A再往数据库里试图添加id=1的数据,会报错说该行数据已存在。于是事务A再次查询id=1的数据,但是依旧发现不存在

注意,这里事务A进行查询时又查不到事务B添加的数据是因为幻读是建立在解决了不可重复读的基础上,所以一个事务内先后查询同一条数据的结果一致,它第一次查询时读不到id=1的数据,那么第二次查询时也会读不到id=1的数据。

解决方案

对事务进行不同级别的隔离,可以解决不同的问题。
注意:事务隔离级别越高,数据越安全,但是性能越低,所以其实一般基本都不考虑串行化,因为这样就失去了并发事务的意义。

隔离级别脏读不可重复读幻读
Read uncommitted 未提交读×××
Read committed 读已提交××
Repeatable Read(默认) 可重复读×
Serializable 串行化

undo log和redo log的区别

mysql内部存储结构

在InnoDB内部,存在两个结构。

  • 缓冲池(buffer pool):主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度
  • 数据页(page):是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。页中存储的是行数据。
    在这里插入图片描述

缓冲池同步数据失败

缓冲池中的数据会以一定频率刷新到磁盘,在未刷新之前,这些文件都叫做”脏页“。那么可能引发一个问题,就是服务器宕机导致缓冲池和磁盘同步数据失败,内存中的脏页消失,导致数据丢失,违背了事务的持久化特性,为此引出redo log的概念。

redo log(重做日志)

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file)

前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中, 用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用。

以上的机制称为WAL,全称是Write-Ahead Logging, 预写日志系统。指的是 MySQL 的写操作并不是立刻更新到磁盘上,而是先记录在日志上,然后在合适的时间再更新到磁盘上。

注意,redo log每隔一段时间会被清理,而且在磁盘中是有两份来循环写的。
在这里插入图片描述

注意点1

以上的机制听起来还是很奇怪,譬如redolog buffer和buffer pool都是存储在内存中的,而且都是等事务提交后再把数据同步到磁盘,那么服务器宕机了,redolog buffer中的数据不还是会消失吗?

注意点2

为什么不采用舍弃redo log,直接buffer pool中一有数据更改就同步到磁盘的做法呢?当然是因为无效的操作会比较多,而且同步数据到磁盘时,都是随机IO,因为不能保证增删改的操作数的量是差不多的。这个需要取决于业务。
而redo log同步数据到磁盘时,因为日志文件是追加的方式写的,所以是顺序IO,性能会提升很多。

undo log(回滚日志)

  • 回滚日志,用于记录数据被修改前的信息 ,
  • 作用包含两个 : 提供回滚 和 MVCC(多版本并发控制) 。
  • undo log和redo log记录物理日志不一样,它是逻辑日志,可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然(注意binlog也是逻辑日志)
  • undo log可以实现事务的一致性和原子性

相关面试题和回答

并发事务带来哪些问题?

候选人

我们在项目开发中,多个事务并发进行是经常发生的,并发也是必然的,有可能导致一些问题

第一是脏读, 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

第二是不可重复读:比如在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

第三是幻读(Phantom read):幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

怎么解决这些问题呢?MySQL的默认隔离级别是?

候选人:解决方案是对事务进行隔离

MySQL支持四种隔离级别,分别有:

第一个是,未提交读(read uncommitted)它解决不了刚才提出的所有问题,一般项目中也不用这个。第二个是读已提交(read committed)它能解决脏读的问题的,但是解决不了不可重复读和幻读。第三个是可重复读(repeatable read)它能解决脏读和不可重复读,但是解决不了幻读,这个也是mysql默认的隔离级别。第四个是串行化(serializable)它可以解决刚才提出来的所有问题,但是由于让是事务串行执行的,性能比较低。所以,我们一般使用的都是mysql默认的隔离级别:可重复读

undo log和redo log的区别

候选人:好的,其中redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据,而undo log 不同,它主要记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据,比如我们删除一条数据的时候,就会在undo log日志文件中新增一条delete语句,如果发生回滚就执行逆操作;

redo log保证了事务的持久性,undo log保证了事务的原子性和一致性

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

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

相关文章

QT中,对于大小端UDP网络发送的demo,帧头帧尾

简单demo: 发送端&#xff1a; #include <QUdpSocket> #include <QtEndian>#pragma pack(1) struct Test {unsigned char t1:1;unsigned char t2:2;unsigned char t3:3;unsigned char t4:2;quint8 a 1;quint16 b 2;quint16 c 3;//double b …

Sqli靶场23-->30

不知不觉鸽了几天了&#xff0c;没办法去旅游摸鱼是这样的了&#xff0c;抓紧时间来小更一下 23.过滤注释符号 先手工注入一下&#xff0c;就能发现两个单引号不报错&#xff0c;但是一旦上到注释符号的话就会报错&#xff0c;可以猜测出是对注释符号进行了过滤&#xff0c;我…

华为配置OSPF与BFD联动示例

配置OSPF与BFD联动示例 组网图形 图1 配置OSPF与BFD联动组网图 OSPF与BFD联动简介配置注意事项组网需求配置思路操作步骤配置文件 OSPF与BFD联动简介 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种用于检测转发引擎之间通信故障的检测…

深度学习系列56:使用whisper进行语音转文字

1. openai-whisper 这应该是最快的使用方式了。安装pip install -U openai-whisper&#xff0c;接着安装ffmpeg&#xff0c;随后就可以使用了。模型清单如下&#xff1a; 第一种方式&#xff0c;使用命令行&#xff1a; whisper japanese.wav --language Japanese --model…

目标检测任务的调研与概述

目标检测任务的调研与概述 0 FQA1 目标检测任务基本知识&#xff1a;1.1 什么是目标检测&#xff1f;1.2 目标检测的损失函数都有那些&#xff1f;1.2.1 类别损失&#xff1a;1.2.2 位置损失&#xff1a; 1.3 目标检测的评价指标都有那些&#xff1f;1.4 目标检测有那些常见的数…

移动云ONAIR媒体云全解读!媒体内容数字化融合一站式解决方案

当下&#xff0c;传统媒体面临着诸多挑战&#xff0c;如何利用信息技术提升内容的质量、形式和分发效率&#xff0c;成为媒体行业的迫切需求。移动云作为数字中国建设的“主力军”&#xff0c; 立足于新兴媒体与云计算市场的变化与需求&#xff0c;推出了ONAIR 媒体云解决方案&…

Redis核心技术与实战【学习笔记】 - 20.Redis原子操作及并发访问

概述 使用 Redis 时&#xff0c;不可避免地会遇到并发访问的问题&#xff0c;比如说如果多个用户同时下单&#xff0c;就会对缓存在 Redis 中的商品库存并发更新。一旦有了并发写操作&#xff0c;数据就会被修改&#xff0c;如果我们没有对并发写请求做好控制&#xff0c;就可…

机器学习中的有监督学习和无监督学习

有监督学习 简单来说&#xff0c;就是人教会计算机学会做一件事。 给算法一个数据集&#xff0c;其中数据集中包含了正确答案&#xff0c;根据这个数据集&#xff0c;可以对额外的数据希望得到一个正确判断&#xff08;详见下面的例子&#xff09; 回归问题 例如现在有一个…

套路化编程 C# winform 自适应缩放布局

本例程实现基本的自适应缩放布局。 在本例程中你将会学习到如何通过鼠标改变界面比例&#xff08;SplitContainer&#xff09;、如何使用流布局&#xff08;FlowLayoutPanel&#xff09;排列控件&#xff0c;当然首先需要了解如何设置控件随窗口缩放。 目录 创建项目 ​编辑…

【npm】安装全局包,使用时提示:不是内部或外部命令,也不是可运行的程序或批处理文件

问题 如图&#xff0c;明明安装Vue是全局包&#xff0c;但是使用时却提示&#xff1a; 解决办法 使用以下命令任意一种命令查看全局包的配置路径 npm root -g 然后将此路径&#xff08;不包括node_modules&#xff09;添加到环境变量中去&#xff0c;这里注意&#xff0c;原…

101 C++内存高级话题 内存池概念,代码实现和详细分析

零 为什么要用内存池&#xff1f; 从前面的知识我们知道&#xff0c;当new 或者 malloc 的时候&#xff0c;假设您想要malloc 10个字节&#xff0c; char * pchar new char[10]; char *pchar1 malloc(10); 实际上编译器为了 记录和管理这些数据&#xff0c;做了不少事情&…

全自动网页生成系统重构版源码

全自动网页生成系统重构版源码分享&#xff0c;所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 为用户使用方便考虑&#xff0c;全自动网页制作系统无需繁琐的注…

陶哲轩如何用 GPT-4 辅助数学研究

关于陶哲轩&#xff08;Terence Tao&#xff09;用 GPT-4 进行数学研究的话题始于陶本人在 微软 Unlocked 上发表的 Embracing Change and Resetting Expectations 一文。文中提到&#xff1a; …… I could feed GPT-4 the first few PDF pages of a recent math preprint and…

Vue3动态CSS

Vue3动态CSS 动态css值动态css对象module模式 动态css值 <template><div class"div">动态css</div> </template><script setup langts> import {ref} from vueconst style ref(blue) </script><style scoped> .div{colo…

绕过无限debugger

目标网站 aHR0cHM6Ly93d3cuaWMubmV0LmNuL3NlYXJjaC81NTAuaHRtbA 改为Firefox浏览器进行调试,取消勾选 Pause on debugger statement 参考:https://blog.csdn.net/kdl_csdn/article/details/135137490

MySQL进阶之锁(表级锁,元数据锁,意向锁)

表级锁 介绍 表级锁&#xff0c;每次操作锁住整张表。锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。应用在MyISAM、 InnoDB、BDB等存储引擎中。 对于表级锁&#xff0c;主要分为以下三类&#xff1a; 表锁 元数据锁&#xff08;meta data lock&…

算法笔记刷题日记——3.简单入门模拟 3.1简单模拟

刷题日记 3.1 简单模拟 此类题型根据题目描述进行代码的编写&#xff0c;考察代码能力&#xff0c;刷题记录如下&#xff1a; B1001 B1032 B1016 B1026 B1046 B1008 B1012 B1018 A1042 A1046 A1065 B1010 A1002 A1009 错题记录 B1008 数组元素循环右移问题 一个数组_A_中存有…

C语言小游戏:贪吃蛇(游戏开发的环境和功能介绍)

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 生命不停&#xff0c;学习不止。铁汁们&#xff0c;我是大伟&#xff0c;欢迎来到大伟的游戏时间&#xff0c…

【论文阅读笔记】InstantID : Zero-shot Identity-Preserving Generation in Seconds

InstantID:秒级零样本身份保持生成 理解摘要Introduction贡献 Related WorkText-to-image Diffusion ModelsSubject-driven Image GenerationID Preserving Image Generation Method实验定性实验消融实验与先前方法的对比富有创意的更多任务新视角合成身份插值多身份区域控制合…

【遥感入门系列】遥感电磁辐射与遥感过程

遥感电磁辐射是比较难理解也是非常重要的内容&#xff0c;对于一般学习遥感专业的人来说&#xff0c;只需要学习个大概&#xff0c;这个大概主要包括你需要理解几个概念以及能从电磁辐射原理上解释一些遥感现象&#xff0c;进而为遥感过程的理解打下一个基础&#xff0c;如果你…