mysql基础面经之三:事务

6 事务

6.1 说一下事务的ACID和隔离级别

1 讲解了AID三个特性都是为了C(一致性)服务的。一般数据库需要使用事务保证数据库的一致性。
正确情况下最好详细讲讲:
ACID是用来描述数据库事务的四个关键特性的首字母缩写,具体包括:

  • 原子性(Atomicity):一个事务(transaction)必须被视为一个不可分割的最小工作单元,整个事务的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不能只执行其中的一部分操作。
  • 一致性(Consistency):事务应确保数据库从一个一致的状态转变为另一个一致的状态。一致性是指数据库应满足预定的约束条件,如数据的完整性约束等。
  • 隔离性(Isolation):多个并发事务之间需要隔离,以防止数据损坏。隔离性保证了一个事务在执行过程中,其操作和产生的中间态对其他并发事务是隔离的,即一个事务的执行不应影响其他事务。
  • 持久性(Durability):一旦事务提交,对数据的修改就是永久性的。即使出现系统故障,修改的数据也不会丢失。
    这四个特性是数据库事务所必需的,可以确保数据的一致性和可靠性。A、I、D三个特性可以看作是为了实现C(一致性)服务的。事务就是为了保证操作数据库的完整性和一致性,这就是ACID的重要性。

2 在SQL标准中定义了四种隔离级别,分别是:.。。。

6.2 假设第一个线程开启了一个事务在开始和快结束时分别读取一次,但是中间第二个线程修改了其中的数据,这个时候 第一个线程第二次读取到的数据是线程二修改后的还是修改前的数据?(重要)

答:这个问题的答案取决于你的数据库事务的隔离级别。

如果线程二的事务没有提交:在读未提交的隔离级别时,可以读取到数据,但是在读已提交、RR的级别下都不能读取到线程二修改后的数据,都只能读取到修改前的数据。

如果线程二的事务提交了:此时不存在读未提交的数据问题,但是在读已提交的隔离级别时,可以读取到修改后的数据,但是在RR级别下读取的是修改前的数据

Serializable级别下,所有事务串行化执行,如果第一个线程的事务先执行,则全程只能读取到修改前的数据,等它执行完了,线程二才能继续执行后续的修改操作。

也可以结合下面这个总结看一下:

  • Read Uncommitted(未提交读):在这个级别,一个事务可能会看到其他事务未提交的数据。所以在你的例子中,线程一第二次读取到的数据将是线程二修改后的数据。
  • Read Committed(提交读):在这个级别,一个事务只能看到其他事务已经提交的数据。在你的例子中,如果线程二在线程一第二次读取之前已经提交了事务,那么线程一会读取到线程二修改后的数据。如果线程二还没有提交,那么线程一将读取到线程二修改前的数据。
  • Repeatable Read(可重复读):在这个级别,一个事务在整个过程中看到的数据是一致的。也就是说,在事务开始后,不会再看到其他事务对数据的修改。在你的例子中,线程一第二次读取到的数据将是线程二修改前的数据,不论线程二是否已经提交了事务。
  • Serializable(可串行化):这是最严格的隔离级别,要求所有事务串行执行。这种级别可以防止所有的并发问题。

需要注意的是,隔离级别越高,数据的一致性越好,但是并发性能可能会降低。所以在实际的系统中需要根据实际的需求和性能要求来选择合适的隔离级别。

6.3 mvcc的快照如何实现的

使用undo log日志,最近一个日志也就是快照,会被数据行的一个隐藏指针db_roll_ptr指向

6.4 写sql

有一个teacher表,字段是id和name,还有一个t_s表,表示teacher-student,有字段tid,sid。现在让你查询学生数大于10个的老师。

select t.name from teacher t left join t_s ts on t.id=ts.id group by t.id having count(ts.sid)>10

6.5 数据库的隔离级别都是针对读操作的吗?

数据库的隔离级别针对的不仅仅是读操作,也包括写操作。但往往我们更关注读操作的一致性,因为在并发环境下,不同的隔离级别会对读操作产生不同的影响,比如脏读、不可重复读和幻读等问题。而写操作通常是由数据库的并发控制机制(如锁)来保证一致性的。

6.6 事务本身不能保证对写的保护,需要配合锁一起完成

你是对的。事务只是提供了一种机制,确保由一组数据库操作构成的逻辑工作单元要么完全完成,要么完全不完成(这就是事务的原子性)。但事务本身并不能防止多个事务并发地修改同一份数据,这可能会导致数据的不一致。

为了解决这个问题,数据库系统通常会使用锁等并发控制机制来防止并发事务之间的冲突。当一个事务试图修改一份数据时,数据库系统会给这份数据加锁,防止其他事务同时修改这份数据。直到这个事务完成(提交或者回滚)并释放锁,其他的事务才能修改这份数据。

这就是为什么我们说数据库的隔离级别提供了对写操作的保护。实际上,这种保护是由数据库的并发控制机制(如锁)来实现的,不同的隔离级别使用了不同的并发控制策略,因此提供了不同程度的写操作保护。

6.6.1 如果个事务在可重复读的情况下,第一次读操作后,使用了update语句更新这个操作,这个时候会重新 生成一次readview吗然后基于最新的数据进行更新?

在可重复读的隔离级别下,一次读操作后如果使用了update语句更新这个操作,不会重新生成一次readview。在可重复读的隔离级别下,事务在开始时生成一个快照,后续的操作都是在这个快照的基础上进行的。当事务执行update语句时,会根据之前的快照进行更新操作。即使有其他事务对这个数据进行了修改,本事务看到的数据仍然是开始时生成快照时的数据。

6.6.2 mysql数据库的事务的一致性范围?

推荐:如何理解数据库事务中的一致性的概念?
在这篇文章中,指明了事务的一致性受到数据库的完整性和应用层业务特性的完整性约束,其中并发约束也属于应用层业务约束的需要,所以mysql事务的一致性的粒度可以是单线程的一致性也可以是多线程下并发的一致性,这取决于业务需要,当然一般的并发业务都需要确保这种并发一致性,所以就会用到锁来解决超卖、幻读等问题,但是单线程的业务就不需要用到锁了。

6.6.3 在RR级别下,前后两次使用select语句查询相关区间内记录跳数,中间另外一个事务往这个区间插入了语句,第二次select这个区间数据会发现多一条吗?

在RR(Repeatable Read)级别下,两次使用SELECT语句查询相同的记录集应该返回相同的结果,即使在两次查询之间有其他事务往这个区间插入了记录。因为在RR隔离级别下,事务在开始时会创建一个数据快照(read view),后续的读操作都是基于这个快照进行的,不会看到在事务开始后其他事务所做的修改。因此,如果在事务开始后其他事务插入了新记录,当前事务在后续的查询中是看不到这些新记录的。

要注意的是,尽管RR级别可以保证已有的记录在事务期间保持一致性,但它并不能阻止其他事务插入新的记录。当当前事务提交后,这些在事务期间插入的新记录就会变得可见。

这也是RR隔离级别无法完全避免幻读(phantom read)的原因。幻读是指在某一个事务提交之后,一个查询的结果集突然出现或消失。在RR级别下,事务不会看到其他事务插入的新行,但当事务提交后,这些新行会变得可见,这就可能导致幻读。

7 串行化相关问题

7.1 串行化一定能保证读取的数据是最新的对吧

是的,串行化是数据库隔离级别中最高的级别,它可以保证事务串行执行,从而避免并发执行的事务产生的各种问题,包括读取的数据不是最新的问题。在串行化级别下,事务的执行结果和它们串行执行的结果一致。

7.2 串行化的事务是数据库中的所有事物吗还是某一张表的关联事务,串行化的粒度有多大

串行化的粒度取决于具体的数据库管理系统和它的并发控制机制。在一些数据库系统中,串行化可能会锁定整个数据库,使得所有的事务都必须串行执行。在其他一些数据库系统中,串行化可能只会锁定被事务访问的数据,使得访问不同数据的事务可以并行执行。

mysql中串行化的粒度有多大?

MySQL中的串行化(SERIALIZABLE)隔离级别会对所有的读操作都加锁,以防止其他事务并发修改数据,从而实现事务的串行执行。这意味着在同一时间只有一个事务能够对同一份数据进行操作。所以可以说,MySQL的串行化隔离级别在数据行级别上进行的,具体的粒度取决于事务操作的数据范围。

7.3 串行化机制是不是也可以在客户端实现,比如消息队列单线程消费的场景

是的,串行化机制并不局限于数据库,它可以应用在任何需要并发控制的场景。比如在消息队列中,你可以让每个消费者线程处理一部分消息,使得不同的消费者线程处理的消息不会有交集,这样就可以达到类似于串行化的效果。但需要注意的是,这种方法依赖于消息的分配策略,如果消息不能均匀地分配给每个消费者线程,那么消费者线程可能会出现空闲,导致系统的吞吐量下降。

8 数据库事物有哪些特性,分别是由什么进行保证和实现?(字节后端一面)

8.1 数据库事务具有以下四个关键特性,通常称为ACID特性:

  1. 原子性(Atomicity):原子性确保事务是一个不可分割的操作单元,要么全部执行,要么全部不执行。如果一个事务中的任何一部分失败,整个事务将被回滚到初始状态,以确保数据的一致性。原子性通常由数据库管理系统(DBMS)来实现,使用事务日志和回滚机制来确保。

  2. 一致性(Consistency):一致性确保事务将数据库从一个一致状态转变为另一个一致状态。这意味着事务执行前后数据库必须满足一定的完整性约束和规则,以确保数据的完整性。一致性通常由应用程序和数据库约束来保证。

  3. 隔离性(Isolation):隔离性确保同时运行多个事务时,每个事务都感觉就像它是唯一运行的,不会受到其他事务的影响。隔离性通过使用锁定机制、多版本控制或其他并发控制技术来实现,以防止数据竞争和不一致的读取。

  4. 持久性(Durability):持久性确保一旦事务成功提交,其结果将永久保存在数据库中,即使系统崩溃或断电也不会丢失。持久性通常通过将事务日志写入非易失性存储(如硬盘)来实现。

8.2 四大特性的实现

这些ACID特性共同确保了事务的可靠性和数据完整性。在数据库管理系统内部,使用日志记录和恢复机制来实现这些特性。具体实现方法可以有所不同,但通常涉及以下步骤:

  • 事务日志(Transaction Log):数据库将事务的所有更改(插入、更新、删除)记录到事务日志中,以便在需要时进行恢复。这包括在提交事务之前记录所有更改,以确保原子性和持久性。

  • 并发控制(Concurrency Control):为了实现隔离性,数据库管理系统使用锁定、时间戳或多版本控制等技术来管理同时运行的事务。这确保了每个事务不会干扰其他事务的操作。

  • 回滚(Rollback):如果事务中的任何一部分失败或发生错误,数据库系统将使用事务日志中的信息将事务回滚到之前的状态,以确保原子性。

  • 持久性保证(Durability Guarantee):数据库管理系统确保将事务日志中的更改写入持久性存储,如硬盘。这确保了即使系统崩溃或断电,事务的结果也不会丢失。

总之,ACID特性是数据库事务的关键特性,通过数据库管理系统的内部机制和恢复策略来实现和保证。这些特性确保了数据的可靠性和完整性,使数据库在面临各种故障和并发访问时仍然能够保持一致性。

8.3 undo log、redo log以及bin log日志对事务的ACID的保证?

8.4 数据库隔离级别:

数据库隔离级别定义了不同事务之间的可见性和互操作性。SQL标准定义了四个隔离级别,从最低到最高分别是Read Uncommitted、Read Committed、Repeatable Read和Serializable。

  1. Read Uncommitted:允许一个事务读取另一个事务未提交的修改,是最低的隔离级别,通常不建议使用,因为可能导致脏读和不可重复读。

  2. Read Committed:保证一个事务不会读取到另一个未提交事务的修改。这是大多数数据库系统的默认隔离级别。

  3. Repeatable Read:确保一个事务在执行期间看到的数据保持一致,即使其他事务在此期间进行了插入或修改。这是MySQL的默认隔离级别。

  4. Serializable:提供最高的隔离级别,确保事务之间不存在并发问题,但性能通常较低。

8.5 RC和RR隔离级别的MVCC机制区别:

  1. RC(Read Committed)隔离级别:在RC隔离级别下,事务可以读取已提交事务的数据,但不能读取未提交事务的数据。MVCC通过在内部为每个事务创建快照来实现这一点,以确保一个事务不会读取到另一个事务未提交的修改。

  2. RR(Repeatable Read)隔离级别:在RR隔离级别下,事务可以读取已提交事务的数据,并且在整个事务期间都不会看到其他事务的插入、更新或删除操作的结果。MVCC也在这里发挥作用,但它在事务开始时创建快照,并在整个事务期间保持不变,以确保数据的一致性。

8.6 在RR隔离级别下避免幻读(MVCC + Next-Key Locking):

幻读是指在一个事务中执行相同的查询,但由于其他事务插入或删除了符合查询条件的行,导致结果集不一致的情况。在RR隔离级别下,为了避免幻读,数据库使用MVCC和Next-Key Locking机制来处理。

  • MVCC:MVCC通过创建事务的快照来确保查询不受其他事务的影响。在RR隔离级别下,查询会使用事务开始时的快照,这意味着在查询期间其他事务的插入、更新和删除不会影响查询结果。

  • Next-Key Locking:Next-Key Locking是一种锁机制,它在RR隔离级别下用于避免幻读。当一个事务执行SELECT语句时,Next-Key Locking会锁定查询范围内的所有记录,并且还会锁定可能在查询之后被插入的记录的"间隙",以防止幻读。这确保了在查询期间其他事务无法插入满足查询条件的新记录。

综上所述,在RR隔离级别下,通过MVCC和Next-Key Locking机制,数据库确保了查询的一致性和避免了幻读问题。MVCC提供了快照来保持查询的一致性,而Next-Key Locking则确保了查询期间的数据不会受到其他事务的插入操作的干扰。这两个机制结合起来,为RR隔离级别下的数据一致性提供了保障。

8.7 只使用 Next-Key Locking,能保证避免幻读嘛, Next-key不是会锁住间隙和行嘛,是行锁和间隙锁的结合,这样应该不允许其他事务修改了吧,然后是不是就能保证幻读了?但是能保证可重复读嘛?

8.8

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

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

相关文章

Vue Element upload组件和Iview upload 组件上传文件

今天要分享的是使用这俩个UI组件库的upload组件分别实现调用组件本身的上传方法实现和后台交互。接下来就是开车的时间&#xff0c;请坐稳扶好~ 一、element upload组件传送门 1、html文件 <el-upload ref"uploadRef" :action"uploadUrl" :data"…

深入探讨C存储类和存储期——Storage Duration

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…

lab8 lock

PreRead 第六章3.5节&#xff1a;物理内存分配器8.1-8.3 文章目录 PreReadMemory allocatortaskshints思路 Buffer cachetaskhints思路实现 这次的lab&#xff0c;本质上都是通过将锁的粒度减小来获得性能的提升 第一个task&#xff0c;可以简单地按cpu划分&#xff0c;因为本…

【大模型AIGC系列课程 3-1】Meta开源大模型:羊驼系列

1. LLaMA https://arxiv.org/abs/2302.13971 LLaMA(由Meta推出)和GPT是两种不同的语言模型。以下是LLaMA相对于GPT的一些优点: ● 架构修改:LLaMA在Transformer架构的基础上进行了一些修改。例如,LLaMA使用了预归一化(pre-normalization)而不是后归一化(post-normaliz…

九耶丨阁瑞钛伦特-Java高频面试题-请谈谈 ReadWriteLock 和 StampedLock

ReadWriteLock包括两种子锁 &#xff08;1&#xff09;ReadWriteLock ReadWriteLock 可以实现多个读锁同时进行&#xff0c;但是读与写和写于写互斥&#xff0c;只能有一个写锁线程在进行。 &#xff08;2&#xff09;StampedLock StampedLock是Jdk在1.8提供的一种读写锁&a…

java.lang.UnsatisfiedLinkError: dlopen failed: library “libyuv.so“ not found

java.lang.UnsatisfiedLinkError: dlopen failed: library "libyuv.so" not found libyuv.so找不到&#xff1a; 解决方法&#xff1a; build.gradle配置: Android根目录下&#xff1a; externalNativeBuild {cmake {version "3.10.2"path file(src/mai…

GPT生产实践之定制化翻译

GPT生产实践之定制化翻译 GPT除了能用来聊天以外&#xff0c;其实功能非常强大&#xff0c;但是我们如何把它运用到生产实践中去&#xff0c;为公司带来价值呢&#xff1f;下面一个使用案例–使用gpt做专业领域定制化翻译 思路&#xff1a; 定制化&#xff1a;有些公司词条的…

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成 目录 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成。 生成对抗…

Ubuntu22.04 交叉编译树莓派CM4 kernel

通过这个文章记录一下如何在Ubuntu22.04编译树莓派CM4的kernel。 主要参考树莓派官网的方法&#xff0c;也总结了一些关于SD卡分区的知识。 1&#xff0c;虚拟机安装Ubuntu 22.04&#xff0c;就不介绍了。 2&#xff0c;先将树莓派官方系统烧录倒SD卡中&#xff0c;设备能正…

Electron+Vue3+TS 打包exe客户端

Electron Vue3 TS 实战 - 掘金 如果报错loaderContext.getOptions is not a function ts-loader版本不一致导致的问题。 解决方案&#xff1a;npm install ts-loader8.0.0 --save

C语言基础之——指针(上)

前言&#xff1a;小伙伴们又见面啦&#xff01;本期内容&#xff0c;博主将展开讲解有关C语言中指针的上半部分基础知识&#xff0c;一起学习起来叭&#xff01;&#xff01;&#xff01; 目录 一.什么是指针 二.指针类型 1.指针的解引用 2.指针-整数 三.野指针 1.野指针…

【洛谷】P2678 跳石头

原题链接&#xff1a;https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。&#xff08;使用二分需要满足两个条件。一个是有界&#xff0c;一个是单调。 这题的题面&#xff1a;使得选手们在比赛过程中…

【数据结构】手撕顺序表

一&#xff0c;概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储&#xff1b; 在数组上完成数据的增删查改。 1&#xff0c; 静态顺序表&#xff1a;使用定长数组存储元素。 2.&#xff0c;动态顺序表&#xff1…

基于Spring Boot的游泳馆管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的游泳馆管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

Springboot使用QueryDsl实现融合数据查询

SpringbootQueryDsl技术 1、添加依赖 <!--基于JPA--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--QueryDSL支持--> <dependenc…

opencv进阶18-基于opencv 决策树导论

1. 什么是决策树&#xff1f; 决策树是最早的机器学习算法之一&#xff0c;起源于对人类某些决策过程 的模仿&#xff0c;属于监督学习算法。 决策树的优点是易于理解&#xff0c;有些决策树既可以做分类&#xff0c;也可以做回归。在排名前十的数据挖掘算法中有两种是决策树[1…

编程题练习@8-26

题目一&#xff1a; 题目描述 你的团队最近更新了语音识别的算法&#xff0c;瑰需要对更新之后的算法模型进行识别率指标统计。 语音识别率指标通常为WER(Word Error Rate)即计算语音识别文本中出现错误的字总数占标准文本中总字数的比例。为了使识别出来的文本序列和标准的文本…

Kafka为什么这么快?

Kafka 是一个基于发布-订阅模式的消息系统&#xff0c;它可以在多个生产者和消费者之间传递大量的数据。Kafka 的一个显著特点是它的高吞吐率&#xff0c;即每秒可以处理百万级别的消息。那么 Kafka 是如何实现这样高得性能呢&#xff1f;本文将从七个方面来分析 Kafka 的速度优…

科技资讯|荷兰电动自行车丢失将被拒保,苹果Find My可以减少丢失

荷兰最大的自行车协会荷兰皇家旅游俱乐部宣布&#xff0c;将不再为胖胎电动自行车提供保险&#xff0c;因为这种自行车的被盗风险极高。 随着电动自行车的销量飙升&#xff0c;胖胎也变得更受欢迎。但问题是&#xff0c;胖胎电动自行车也成为了自行车盗窃者的首选目标。ANWB …

字节 比特

1 字节 8 比特 //1 字节 8 位 / 比特 1 Byte 1 B 8 bit位 比特 bit 字节 Byte B 1024 1 KB 1024 B 1 MB 1024 KB 1 GB 1024 MB字&#xff0c;由若干个字节组成 32 位计算机&#xff1a;1 字 32 位 4 字节 64 位计算机&#xff1a;1 字 64 位 8 字节