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特性:
-
原子性(Atomicity):原子性确保事务是一个不可分割的操作单元,要么全部执行,要么全部不执行。如果一个事务中的任何一部分失败,整个事务将被回滚到初始状态,以确保数据的一致性。原子性通常由数据库管理系统(DBMS)来实现,使用事务日志和回滚机制来确保。
-
一致性(Consistency):一致性确保事务将数据库从一个一致状态转变为另一个一致状态。这意味着事务执行前后数据库必须满足一定的完整性约束和规则,以确保数据的完整性。一致性通常由应用程序和数据库约束来保证。
-
隔离性(Isolation):隔离性确保同时运行多个事务时,每个事务都感觉就像它是唯一运行的,不会受到其他事务的影响。隔离性通过使用锁定机制、多版本控制或其他并发控制技术来实现,以防止数据竞争和不一致的读取。
-
持久性(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。
-
Read Uncommitted:允许一个事务读取另一个事务未提交的修改,是最低的隔离级别,通常不建议使用,因为可能导致脏读和不可重复读。
-
Read Committed:保证一个事务不会读取到另一个未提交事务的修改。这是大多数数据库系统的默认隔离级别。
-
Repeatable Read:确保一个事务在执行期间看到的数据保持一致,即使其他事务在此期间进行了插入或修改。这是MySQL的默认隔离级别。
-
Serializable:提供最高的隔离级别,确保事务之间不存在并发问题,但性能通常较低。
8.5 RC和RR隔离级别的MVCC机制区别:
-
RC(Read Committed)隔离级别:在RC隔离级别下,事务可以读取已提交事务的数据,但不能读取未提交事务的数据。MVCC通过在内部为每个事务创建快照来实现这一点,以确保一个事务不会读取到另一个事务未提交的修改。
-
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
相关文章:
mysql基础面经之三:事务
6 事务 6.1 说一下事务的ACID和隔离级别 1 讲解了AID三个特性都是为了C(一致性)服务的。一般数据库需要使用事务保证数据库的一致性。 正确情况下最好详细讲讲: ACID是用来描述数据库事务的四个关键特性的首字母缩写,具体包括&a…...

JavaScript基本数组操作
在JavaScript中,内置了很多函数让我们可以去对数组进行操作,本文我们就来学习这些函数吧 添加元素 push ● push可以让我们在数组后面再添加一个数据,例如 const friends ["张三", "李四", "王五"]; frie…...

C#---第21: partial修饰类的特性及应用
0.知识背景 局部类型适用于以下情况: 类型特别大,不宜放在一个文件中实现。一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。需要多人合作编写一个类 局部类型的限制: 局部类型只适用于类、接口、结构&am…...

SQL 语句继续学习之记录三
一,数据的插入(insert 语句的使用方法) 使用insert语句可以向表中插入数据(行)。原则上,insert语句每次执行一行数据的插入。 列名和值用逗号隔开,分别扩在()内,这种形式称为清单。…...

Nexus仓库介绍以及maven deploy配置
一 、Nexus仓库介绍 首先介绍一下Nexus的四个仓库的结构: maven-central 代理仓库,代理了maven的中央仓库:https://repo1.maven.org/maven2/; maven-public 仓库组,另外三个仓库都归属于这个组,所以我们的…...
A Survey on Knowledge-Enhanced Pre-trained Language Models
摘要 自然语言处理(NLP)已经通过使用BERT等预训练语言模型(plm)发生了革命性的变化。尽管几乎在每个NLP任务中都创造了新的记录,但plm仍然面临许多挑战,包括可解释性差,推理能力弱,以及在应用于下游任务时需要大量昂贵的注释数据。通过将外部知识集成到plm中,知识增强预训…...

SQL求解用户连续登录天数
数据分析面试过程中,一般都逃不掉对SQL的考察,可能是笔试的形式,也可能是面试过程中面试官当场提问,当场在纸上写出,或者简单说一下逻辑。 今天,就来分享一道面试中常常被问到的一类SQL问题:连…...

掌握逻辑漏洞复现技术,保护您的数字环境
环境准备 这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。 1、支付逻辑漏洞 攻击相关介绍 介绍: 支付逻辑漏洞是指攻击者利用支付系统的漏洞,突破系统的限制,完成非法的支付操作。攻击者可以采…...

windows系统服务器在不解锁屏幕不输入密码的前提下,电脑通电开机启动程序。
在控制面板中找到“管理工具”中的 “任务计划程序”,打开“任务计划程序”窗口。如图: 双击打开任务计划程序,空白出右键创建基本任务,或者点击最右侧的创建基本任务。 输入名称,点击下一步。 先选择计算机启动时&a…...

spring cloud seata集成
目录 一、seata使用场景 二、seata组成 三、seata服务端搭建 四、客户端使用seata 4.1 客户端增加undo_log表 4.2 客户端增加seata相关配置 4.3 客户端使用注解 五、测试 一、seata使用场景 微服务中,一个业务涉及到多个微服务系统,每个微服务…...
HTTP 常⻅的状态码有哪些,以及适⽤场景
⼀、HTTP状态码 HT T P 状态码( HT T P S t a t u s Co d e )是⽤来表示⽹⻚服务器超⽂本传输协议响应状态的 3 位数字代 码。它由 RFC 2 6 1 6 规范定义,并得到 RFC 2 5 1 8 、 RFC 2 8 1 7 、 RFC 2 2 9 5 、 RFC 2 7 7 4 与 RFC 4 9 1 8…...
后端给前端传参数忽略空属性
JsonInclude JsonInclude注解用于指定在对象序列化为JSON字符串时,哪些属性应该被包含进去,哪些属性应该被忽略掉。 JsonInclude注解有以下几个常用选项: JsonInclude(JsonInclude.Include.NON_NULL):表示只有属性值不为null的属…...

SPSS教程:如何绘制带误差的折线图
SPSS教程:如何绘制带误差的折线图 1、问题与数据 研究者想研究45-65岁健康男性中,静坐时长和血胆固醇水平的关系,故招募100名研究对象询问其每天静坐时长(time),并检测其血液中胆固醇水平(cho…...
积分商城小程序如何精细化运营
随着移动互联网的发展,积分商城小程序成为了企业私域营销的重要组成部分。通过积分商城,企业可以激励用户参与、增加用户粘性,实现更好的用户互动和忠诚度提升。然而,要取得成功,积分商城小程序需要经过精细化的运营。…...
企业网络日志管理:EventLog Analyzer的卓越之处
企业网络日志管理对于维护网络安全、监控系统性能和合规性非常重要。随着网络规模和复杂性的增加,管理日志变得越来越具有挑战性。幸运的是,有一些优秀的工具可以帮助企业实现高效的日志管理。其中一款值得一提的工具是EventLog Analyzer。 一、EventLo…...
Python算法——滑动窗口问题
关于滑动窗口的概念,请自行到网上搜索相关资料,了解清楚再看本博客。 一、子组数最大平均数 LeetCode 第643题:https://leetcode.cn/problems/maximum-average-subarray-i/ 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你…...

使用 MATLAB 和 Simulink 对雷达系统进行建模和仿真
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Linux 中的 sysctl 命令及示例
介绍 Linux管理员使用该命令在运行时sysctl读取或修改内核参数。无需重新启动即可实时控制和修改网络、 I/O 操作和内存管理设置的选项对于高可用性系统至关重要。 了解如何使用该sysctl命令及其选项来动态调整系统性能。...
Mybatis批量更新数据及其优化
需求场景:定时任务中,从其他平台同步数据,并更新当前平台数据库,表数据3W,分批更新某个字段,耗时巨大,约30min,尝试性能优化。 批量更新的几种常见方式: 1.foreach 循环…...

包含文心一言在内的首批国产大模型 全面开放
8月31起,国内 11 家通过《生成式人工智能服务管理暂行办法》备案的 AI 大模型产品将陆续上线,面向全社会开放。北京 5 家大模型产品分别是百度的 “文心一言”、抖音的 “云雀”、百川智能的 “百川大模型”、清华系 AI 公司智谱华章旗下的 “智谱清言”…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...