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

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

事务的特性(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.mzph.cn/news/669028.shtml

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

相关文章

idea开发工具的简单使用与常见问题

1、配置git 选择左上角目录file->setting 打开,Version Control 目录下Git,选择git安装目录下的git.exe文件; 点击test,出现git版本,则表示git识别成功,点击右下角确认即可生效。 2、配置node.js 选…

ubuntu开机报错/dev/nume0n1p2:clean

本来是开机卡在这个界面,经过以下操作,变成这种了 现在的问题变成linux卡在 failed to start NVIDIA Persistence Daemon 按照下面的操作方法,可以有开机界面了。但是输入密码后,一直在登录界面 1.方式一:重新安装显…

TypeScript 学习笔记(Day4)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. TypeScript 学习笔记(Day1) 2. TypeScript 学习笔…

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项,用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间,如果在指定的时间内没有数据可读取,将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下,SO_TIMEOUT选项的值…

SystemVerilog约束随机(二)

文章目录 前言一、SystemVerilog约束随机1.1 集合操作set membership1.2 权重约束weighted constraints1.3 队列约束array constranint1.4 条件约束order constraints1.5 等价约束equivalence constraints1.6 顺序约束solver order 总结 前言 这里主要记录一下systemverilog中…

【Rust】——rust前言与安装rust

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

ACM训练题:Division

题意是给你N&#xff0c;打印出所有相除等于N的五位数&#xff08;包含前导零&#xff09;&#xff0c;可以枚举后五位&#xff0c;计算量是10&#xff01;/5&#xff01;&#xff0c;然后乘N&#xff0c;一起检验10个数是否都出现。 AC代码&#xff1a; #include <iostre…

蓝桥杯省赛无忧 课件111 带权并查集

01 什么是带权并查集&#xff1f; 02 算法原理 03 经典例题分析

uniapp踩坑之项目:简易版不同角色显示不一样的tabbar和页面

1. pages下创建三个不同用户身份的“我的”页面。 显示第几个tabbar&#xff0c;0是管理员 1是财务 2是司机 2. 在uni_modules文件夹创建底部导航cc-myTabbar文件夹&#xff0c;在cc-myTabbar文件夹创建components文件夹&#xff0c;在components文件夹创建cc-myTabbar.vue组件…

五、MyBatis 高级扩展

本章概要 Mapper 批量映射优化插件和分页插件 PageHelper 插件机制和 PageHelper 插件介绍PageHelper 插件使用 逆向工程和 MybatisX 插件 ORM 思维介绍逆向工程逆向工程插件 MyBatisX 使用 5.1 Mapper 批量映射优化 需求 Mapper 配置文件很多时&#xff0c;在全局配置文件…

Spark Shuffle Service简介与测试

一 Dynamic Resource Allocation(动态资源分配) 了解Shuffle Service之前&#xff0c;我们需要先了解和Shuffle Service有关的另一个特性&#xff1a;动态资源分配。 Spark管理资源有两种方式&#xff1a;静态资源分配和动态资源分配。 静态资源分配&#xff1a;spark提交任…

Java并发基础:Phaser全面解析!

内容概要 Phaser是Java中一个灵活的同步工具&#xff0c;其优点在于支持多阶段的任务拆分与同步&#xff0c;并且能够动态地注册与注销参与者&#xff0c;它提供了丰富的等待与推进机制&#xff0c;使得开发者能够更细粒度地控制线程的协调行为&#xff0c;实现复杂的并行任务…

Redis核心技术与实战【学习笔记】 - 25.Redis 支撑秒杀场景的关键技术

简述 秒杀是一个非常经典的活动场景&#xff0c;比如&#xff0c;在双 11、618 等电商促销活动中&#xff0c;都会有秒杀场景。秒杀场景的业务特点是限时限量&#xff0c;业务系统要处理瞬时的大量高并发请求&#xff0c;而 Redis 就经常被用来支撑秒杀活动。 秒杀场景包含多…

2.4日总结

第一题&#xff1a;选数 题解&#xff1a;思路还是很简单的&#xff0c;只需要想清楚dfs里的函数都是什么就可以了&#xff0c;还有一个简单的判断素数的函数&#xff0c;这题真没啥难度&#xff0c;就是属于基础题吧&#xff0c;请看AC代码 #include <stdio.h> #includ…

【c/python】GtkGrid

一、GtkGrid GtkGrid 是 GTK (GIMP Toolkit) 中的一个基础容器构件&#xff08;widget&#xff09;&#xff0c;它可以用来安排其他构件在一个灵活的多行多列的网格中。每个加入网格的构件都可以占据一个或多个行和列。由于 GtkGrid 提供了在二维空间中安排构件的方式&#xf…

YOLOv5独家改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv5网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/cate…

多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测

多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络…

2 物理层(一):数据通信的基本概念

目录 目标1 数据通信的基本概念1.1 数据通信的基本概念1、数据2、信息3、信号4、信道5、通信和数据通信6、数据通信网7、码元和码字8、数据分组9、基带传输、频带传输和宽带传输基带传输频带传输宽带传输 1.2 数据通信的主要技术指标1.3 数据通信系统1、数据通信系统基本模型编…

【ARM 嵌入式 编译系列 2.7 -- GCC 编译优化参数详细介绍】

文章目录 GCC 编译优化概述常用优化等级-O1 打开的优化选项-O2 打开的优化选项-O3 打开的优化选项-Os 打开的优化选项优化技术使用优化选项的注意事项GCC 编译优化概述 GCC(GNU Compiler Collection)包含了用于C、C++、Objective-C、Fortran、Ada和Go等语言的编译器。在编译…