事务和索引(面试常问)

news2024/9/25 23:16:11

面试常问:

一、数据库隔离级别?事务隔离级别解决的问题?

答:1.数据库隔离级别:

  • READ_UNCOMMITTED 读未提交
  •  READ_COMMITTED 读提交(不可重复读)
  •  REPEATABLE_READ 可重复读
  •  SERIALIZABLE 串行化

2.事务的隔离级别解决的问题

(1)READ_UNCOMMITTED 读未提交

事务读取:不加锁

事务写入:加写锁

解决问题:脏写

存在问题:脏读、不可重复读、幻读。

(2)READ_COMMITTED 读提交(不可重复读)

事务读取:加读锁(每次select完成都会释放读锁)

事务写入:加写锁

解决问题:脏写、脏读

存在问题:不可重复读、幻读。

(3)REPEATABLE_READ 可重复读

事务读取:加读锁(每次select不会释放锁,而是事务结束后才释放)(如果是MySQL的InnoDB还会加间隙锁)

事务写入:加写锁

解决问题:脏写、脏读、不可重复读、幻读(如果是MySQL的InnoDB则解决)

存在问题:幻读(如果是MySQL的InnoDB则不存在)

(4)SERIALIZABLE 串行化

不管读取还是修改所有的事务串行化执行,一个事务的执行必须等其他事务结束。

二、幻读和不可重复度概念?

答:1.不可重复读 Unrepeatable Read
不可重复读指一个事务对统一数据的读取结果前后不一致

2.幻读 Phantom Read
幻读指事务读取某个范围的数据时,因为其他事物的操作导致前后两次读取的结果不一致

这两种情况都是事务并发时可能出现的问题。

三、数据库事务的理解以及实现原理?

答:1.事务:就是将一组SQL语句放在同一批次去执行,如果有一个SQL语句出错,则该批次内所有的SQL语句全部被取消执行。

2.实现原理:

  • 日志记录:在事务执行过程中,对每一个操作都会进行日志记录。这些日志包含了操作的详细信息,用于在出现故障时进行恢复。
    例如,记录修改前和修改后的数据值。

  • 锁机制:通过对数据加锁来保证事务的隔离性和并发控制。
    比如,在一个事务修改某行数据时,会对该行加排他锁,防止其他事务同时修改。

  • 回滚机制:如果事务执行过程中出现错误或者事务被主动取消,能够根据日志记录将数据回滚到事务开始之前的状态。

  • 提交确认:当事务所有操作成功完成后,进行提交操作,将更改永久保存到数据库

四、说说你对锁的理解?

       在MySQL中,特别是针对InnoDB存储引擎,存在多种类型的锁,⽤于控制事务之间的并发访问, 确保数据的⼀致性和隔离性。以下是⼀些常⻅的锁类型:

1. 共享锁(S):也称为读锁。当⼀个事务对某个数据项加了共享锁,其他事务可以同时对该数 据项加共享锁,但不能加排他锁。共享锁主要⽤于⽀持读取操作。

2. 排他锁(X):也称为写锁。当⼀个事务对某个数据项加了排他锁,其他事务不能对该数据项 加任何类型的锁。排他锁主要⽤于⽀持写⼊操作,如更新、插⼊或删除数据。

3. 意向共享锁(IS):事务想要获取⼀个表上的多个⾏的共享锁时,可以在表级别加意向共享 锁。这样可以减少锁的粒度,提⾼并发性能。

4. 意向排他锁(IX):事务想要获取⼀个表上的多个⾏的排他锁时,可以在表级别加意向排他 锁。这种锁表明事务可能需要对这些⾏加排他锁。

5. 表锁:这种锁是在表级别上加的,通常⽤于MyISAM存储引擎。表锁包括表共享读锁和表排他 写锁,它们分别对应于共享锁和排他锁。

6. 行级锁:这种锁是在⾏级别上加的,主要⽤于InnoDB存储引擎。⾏级锁包括记录锁(Record Locks)、间隙锁(Gap Locks)和临键锁(Next-Key Locks)。这些锁主要⽤于实现 MVCC(多版本并发控制)和避免幻读现象。

7. 乐观锁:这种锁机制假设并发冲突较少,事务在提交时才检查是否有冲突。通常通过版本号或 时间戳来实现。

8. 悲观锁:这种锁机制假设并发冲突较多,事务在开始时就加锁,以防⽌其他事务的修改。这种 ⽅式可能导致锁等待和性能下降。

        在实际应⽤中,MySQL会根据事务的需要和配置参数⾃动选择合适的锁类型,以平衡并发性能和 数据⼀致性。了解这些锁类型有助于优化数据库性能和解决并发访问问题。

五、InnoDB支持的锁是什么?

  InnoDB 支持多种类型的锁,主要包括以下几种:

1.共享锁(Shared Lock,S 锁):允许其他事务读取锁定的数据,但不允许修改。多个事务可以同时持有共享锁。例如,在一个查询操作中,如果只是读取数据而不进行修改,就会获取共享锁。

2.排他锁(Exclusive Lock,X 锁):仅允许持有该锁的事务进行读取和修改操作,其他事务无法获取任何类型的锁。比如在进行数据修改或插入操作时,会获取排他锁。

3.意向共享锁(Intention Shared Lock,IS 锁):当事务想要在表的某些部分获取共享锁时,首先在表级别获取意向共享锁。

4.意向排他锁(Intention Exclusive Lock,IX 锁):当事务想要在表的某些部分获取排他锁时,首先在表级别获取意向排他锁。

5.记录锁(Record Lock):锁定表中的某一行记录。

6.间隙锁(Gap Lock):用于锁定一个范围,但不包含记录本身,主要用于防止幻读。

7.临键锁(Next-Key Lock):它是记录锁和间隙锁的组合,既锁住记录,又锁住记录前面的间隙。

     这些锁的存在和协同工作,保证了 InnoDB 存储引擎在并发环境下的数据一致性和完整性。例如,在一个高并发的数据库系统中,多个事务同时对同一张表进行操作,通过合理地获取和释放各种锁,可以避免数据冲突和错误。

六、redis分布式和mysql实现的乐观锁有什么区别?

        Redis分布式锁和MySQL乐观锁的主要区别在于数据存储方式、‌事务处理、‌隔离性、‌持久性和一致性保证。‌

1.数据存储方式:‌

        Redis分布式锁是通过在内存中存储锁的状态来实现的,‌而MySQL乐观锁是基于关系型数据库的行级别锁机制,‌通过在数据表中添加版本号或时间戳来实现并发控制。‌

2.事务处理:‌

        Redis事务只能保证事务内指令可以不被干扰地在同一批次执行,‌但没有机制保证全部成功则提交,‌部分失败则回滚。‌MySQL事务支持强原子性,‌有Undo Log机制,‌支持回滚。‌

3.隔离性:‌

        MySQL提供多个事务并发执行的能力,‌有MVCC机制保证隔离性。‌Redis在单线程环境下执行事务,‌没有提供多事务并发执行的隔离性保证。‌

4.持久性:‌

        MySQL事务先写Undo Log,‌并有Redo Log的两阶段提交机制,‌可以保证持久性。‌        

        Redis只有RDB和AOF持久化策略,‌若事务成功执行且数据刚好被保存,‌则可以满足持久性要求。‌

5.一致性:‌

        MySQL保证数据库从一个合法状态转换成另一个合法状态的一致性。‌Redis只要执行不出错,‌可以保证一致性。‌

        综上所述,‌Redis分布式锁和MySQL乐观锁在设计理念、‌实现方式以及保证的属性上都有显著的区别,‌选择使用哪种锁机制取决于具体的应用场景和需求

七、什么是死锁?怎么解决死锁?

1.死锁

在MySQL中,死锁是指两个或多个事务在等待对⽅释放锁的情况下,导致所有事务都⽆法继续执 ⾏的现象。死锁通常发⽣在事务并发操作且相互锁定资源时。

2.死锁产生的必要条件:

  1. 互斥条件:资源只能被一个进程使用。
  2. 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但仍保持已有的资源。
  3. 不可剥夺条件:进程所获得的资源在未使用完之前,不能被其他进程强行夺走。
  4. 循环等待条件:存在一种进程资源的循环等待链。

3.死锁检测

  • 使⽤INFORMATION_SCHEMA: 可以通过查询 INFORMATION_SCHEMA.INNODB_TRX 和 INFORMAT ION_SCHEMA.INNODB_LOCKS 这两个视图来检测事务和锁的状态。
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

这些查询可以帮助你了解当前活跃的事务及其持有的锁信息。

  • SHOW ENGINE INNODB STATUS: 这个命令可以显示InnoDB存储引擎的当前状态,包括锁 信息、事务状态等,有助于分析死锁情况。
SHOW ENGINE INNODB STATUS;

4.解决死锁的方法

  • 设置超时时间: 通过设置 innodb_lock_wait_timeout 参数,可以指定事务等待锁的超时时 间。超过这个时间后,事务将⾃动回滚。
SET GLOBAL innodb_lock_wait_timeout = 60;
  • ⼿动⼲预: 通过查询 INFORMATION_SCHEMA.INNODB_TRX 找到死锁的事务,然后⼿动杀死其中⼀ 个事务,以解除死锁。
SELECT trx_mysql_thread_id FROM INFORMATION_SCHEMA.INNODB_TRX WHERE trx_sta
te = 'LOCK WAIT';
KILL trx_mysql_thread_id;
  • 调整事务的执⾏顺序: 改变事务中SQL语句的执⾏顺序,或者调整事务的⼤⼩和范围,可以避 免死锁的发⽣。
  • 使⽤死锁检测⼯具: MySQL本身没有内置的死锁检测⼯具,但可以通过第三⽅⼯具或⾃定义脚 本来检测和处理死锁。
  • 优化锁的使⽤: 尽量减少锁的持有时间,避免在事务中进⾏⻓时间的计算或等待操作。尽量使 ⽤低隔离级别的事务,以减少锁的使⽤。
  • 使⽤悲观锁或乐观锁: 根据实际情况选择适合的锁策略。悲观锁适⽤于并发冲突较多的场景, 乐观锁适⽤于并发冲突较少的场景。

        通过以上⽅法,可以有效地检测和解决MySQL中的死锁问题,提⾼系统的稳定性和性能。

        例如,在一个数据库系统中,如果两个事务分别持有一部分数据的锁,并同时请求对方持有的锁,就可能导致死锁。可以通过合理的事务设计和资源分配策略来预防或解决死锁问题。

八、说说索引?底层是什么数据结构(索引的底层结构是什么)?为什么用B+树?为什么不用红黑树?

1.定义:索引是数据库的一种排序结构,用于加快数据的检索和查询速度。

2.索引的底层数据结构B+树

3.用B+树,不用红黑树做数据结构的原因:

  • 磁盘访问:处理大量磁盘存储数据,B+树节点容纳键值对多,减少磁盘 I/0 次数。
  • 数据组织:B+树数据记录存于叶子节点,连续存储便于范围查询和顺序访问。
  • 高度平衡:B+树节点含更多子节点,高度低,查询效率高,红黑树结构调整多。
  • 空间利用:B+树非叶子节点不存数据记录,空间利用率高。
  • 并发控制:B+树更易支持并发操作,范围查询时易实现锁粒度控制。

综上,B+树在磁盘、数据组织、查询、空间和并发控制等方面更适合数据库索引,所以被 MySQL 选用。

九、B树和B+树的区别?为什么数据库索引使用了B+树?谈谈相对于B树的优点?

1.B树和B+树的区别

B树(B-Tree)和B+树(B+-Tree)是两种常用的数据结构,特别是在数据库和文件系统中用于实现索引。它们的主要区别:

(1)数据存储位置

  • B树: 数据可以存储在非叶子节点和叶子节点中。每个节点包含一组键值对,这些键值对按顺序排列。
  • B+树: 所有数据记录都存储在叶子节点中。非叶子节点仅包含键值,用于指导搜索路径。

(2)节点结构

  • B树: 每个节点包含多个键值对和多个子节点指针。节点内的键值对和子节点指针数量之间存在一定的关系,以保持平衡。
  • B+树: 每个非叶子节点包含多个键值和相同数量的子节点指针。叶子节点除了包含数据记录外,还包含指向相邻叶子节点的指针,形成一个链表。

(3)搜索性能

  • B树: 搜索操作可能需要访问非叶子节点,搜索路径上的每个节点都需要比较和跳转。
  • B+树: 搜索操作只需访问叶子节点。由于叶子节点形成一个链表,搜索过程中可以快速遍历所有键值。

(4)插入和删除操作

  • B树: 插入和删除操作可能导致节点分裂或合并,维护树的平衡。
  • B+树: 插入和删除操作仅影响叶子节点,非叶子节点仅需更新键值和指针信息。

(5) 应用场景

  • B树: 适用于需要快速访问中间节点数据的场景,如文件系统中的目录结构。
  • B+树: 适用于需要频繁搜索、插入和删除操作的场景,如数据库索引。由于所有数据都在叶子节点,B+树在范围查询和排序方面更具优势。

2.数据库索引使用 B+树的原因以及相对于 B 树的优点

(1)磁盘读写代价更低:B+树的非叶子节点不存储数据,相同磁盘页可以容纳更多的关键字,降低了树的高度,减少了磁盘 I/O 次数。

(2)范围查询更高效:B+树的叶子节点通过链表相连,便于进行范围查询,而 B 树则不便于范围查询。

(3)数据存储更集中:B+树的所有数据都存储在叶子节点,方便进行数据的批量读取和写入。

(4)稳定性更高:B+树的插入和删除操作相对更稳定,对树的结构调整较小。

十、聚簇索引是什么?

        1.如果表设置了主键,则主键就是聚簇索引

        2.如果表没有主键,则会默认第一个NOT NULL且唯一(UNIQUE)的列作为聚簇索引

        3.以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引

        InnoDB的聚簇索引的叶子节点存储的是行记录(其实是页结构,一个页包含多行数据),InnoDB必须要有至少一个聚簇索引
        由此可见,使用聚簇索引查询会很快,因为可以直接定位到行记录

十一、使用普通索引查询的过程?索引是怎么发挥作用的?

1.定义:普通索引也叫二级索引除聚簇索引外的索引,即非聚簇索引
InnoDB的普通索引叶子节点存储的是主键(聚簇索引)的值,而MyISAM的普通索引存储的是记录指针。

2.步骤:(这个过程叫做回表

  • 首先,数据库系统会在普通索引中查找与查询条件匹配的索引值。普通索引通常存储的是索引列的值以及对应的主键值。
  • 找到匹配的索引值后,通过索引中存储的主键值,再去主键索引(如果有的话)中查找完整的行数据。

3.作用:

        (1)索引发挥作用的关键在于它能够大大减少数据库需要扫描的数据量。如果没有索引,数据库可能需要逐行扫描整个表来查找符合条件的数据,这是非常耗时的。而有了索引,就能够快速定位到可能包含符合条件数据的位置,从而提高查询效率

       (2)(缺点)但需要注意的是,过多的索引会增加数据插入、更新和删除操作的开销,因为这些操作不仅要更新数据,还要维护相关的索引。所以,在设计数据库时,需要合理地创建索引,权衡查询性能和数据维护的成本。

十二、全文索引是什么?是什么结构?

1.定义:全文索引是一种特殊的索引类型,主要用于对文本类型的字段(如文章内容、评论等)进行快速搜索

2.数据结构:它的结构通常基于倒排索引倒排索引类似于一个字典,其中包含了单词(或称为词项)以及包含这些单词的文档列表。

十三、导致索引失效的情况?

  1. 最佳左前缀法则
  2. 主键插入顺序
  3. 计算、函数导致索引失效
  4. 类型转换导致索引失效
  5. 范围条件右边的列索引失效
  6. 不等于(!= 或者<>)索引失效
  7. is null可以使用索引,is not null无法使用索引
  8. like以通配符%开头索引失效
  9. OR 前后存在非索引的列,索引失效
  10. 数据库和表的字符集统一使用utf8mb4

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

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

相关文章

Spring学习(三)-Bean的作用域和生命周期

Spring学习&#xff08;三&#xff09;-Bean的作用域和生命周期 –2020年06月25日 一、bean的作用域 概念&#xff1a; Spring 2.5之前的Bean 的作用域只有两种 Springleton&#xff1a;单例Bean Prototype &#xff1a; 原型Bean Spring 2.5 之后Bean的作用域有一下五种 …

C语言 Unix 时间戳 和 时间日期相互转换

Unix 时间戳&#xff08;也称为 POSIX 时间戳&#xff09;是一个表示从 1970 年 1 月 1 日 UTC 时刻开始所经过的秒数的数值。这个时间戳是与时间区域无关的&#xff0c;也就是说它在全球任何地方都表示同一个时刻。 如果你要将 Unix 时间戳转换为某个特定时区的时间&#xff…

封闭式蓝牙耳机推荐?4款更实用的开放式耳机推荐

封闭式耳机我想应该是头戴式耳机中的一种耳机类型吧&#xff0c;而开放式耳机则是一种范围比较大的耳机类型&#xff0c;这两种耳机类型确实有比较大的区别&#xff1a; 声音泄漏与隔音效果&#xff1a; 开放式耳机&#xff1a;由于其设计允许空气流通&#xff0c;因此声音会…

调用DXGI截图初始化失败,提示0xf 887a0004

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

09.FreeRTOS时间片调度与任务相关函数

文章目录 09. FreeRTOS时间片调度与任务相关函数1. FreeRTOS时间片调度2. 任务状态查询API函数3. 任务时间统计API函数 09. FreeRTOS时间片调度与任务相关函数 1. FreeRTOS时间片调度 时间片调度简介&#xff1a; 时间片调度实验流程&#xff1a; 核心代码&#xff1a; 开…

盲盒卡牌风靡市场,抽卡机小程序成为新的机遇

如今&#xff0c;在商场中都可以看到卡牌的身影&#xff0c;拆卡成为了当下年轻人休闲娱乐的新宠&#xff0c;卡牌市场逐渐升温。抽卡机小程序作为一个能够快速拆卡的新模式&#xff0c;已经逐渐成为了用户拆卡的重要渠道&#xff0c;也为卡牌市场的发展提供了重要方式。本文将…

数字化转型如何通过数据改变企业的运营流程?

不仅仅是技术层面的革新&#xff0c;更是企业运营理念、组织架构、文化氛围及市场策略的全面升级。数字化转型通过深度融合云计算、大数据、人工智能、物联网等前沿技术&#xff0c;优化企业运营流程&#xff0c;提升效率&#xff0c;增强竞争力&#xff0c;从而在快速变化的市…

RTOS(8)信号量和互斥量

1.信号量 信号量分为二值信号量和计数信号量 与队列相比&#xff1a;他不能传输数据&#xff0c;但同时他不需要传输数据&#xff0c;占用的空间也更小&#xff0c;运行更快&#xff1b; 2.互斥量 与二值信号量类似&#xff0c;是特殊的信号量&#xff0c;本身是想实现谁上锁…

【Harmony Next】在鸿蒙项目中一键添加卡片

【Harmony Next】在鸿蒙项目中一键添加卡片 1.下载鸿蒙编译器DevEco Studio的插件DevEco CodeGenie【下载链接】 在华为的编译器现在官网下面可以下载DevEco CodeGenie的压缩包&#xff0c;安装后可以使用DevEco CodeGenie进行智能问答、生成卡片、知识查询等操作 2.安装DevE…

MapStruct实体映射工具

一丶MapStruct是什么 MapStruct 是一个代码生成器,它基于配置方法的约定,极大地简化了 Java Bean 类型之间映射的实现,生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。 官方网站 MapStruct – Java bean mappings, the easy way! 二丶为什么需要MapStru…

桌管系统能否查微信聊天记录?这篇文章告诉你答案

桌面管理系统&#xff08;简称“桌管系统”&#xff09;确实可以用来监控和查看员工的微信聊天记录。以“安企神”这款桌管系统为例&#xff0c;它提供了全面的功能来帮助企业管理和监控员工的上网行为及通信记录。以下是关于安企神系统如何查看微信聊天记录的一些具体信息&…

什么是行为监控?企业透明化管理新纪元!揭秘四款顶尖行为监控软件!

行为监控&#xff0c;是指通过技术手段对员工在工作场所内的行为、活动以及数据使用情况进行全面、实时的监测与分析。它不仅帮助管理者洞悉员工工作状态&#xff0c;提升团队效率&#xff0c;还能有效防止数据泄露和不当行为&#xff0c;为企业构建更加安全、有序的工作环境。…

RAG前沿技术/解决方案梳理

RAG前沿技术/解决方案梳理 BenchmarkRetrievalAdaptive-RAGDR-RAGRichRAGGenRT Critique/ReasoningSelf-RAGCorrective RAGSpeculative RAGPlanRAGSelf-ReasoningReSP MemorySelfmemHippoRAG Query RewriteRaFe SummaryRefiner 个人理解 对当前RAG的学术研究&#xff08;或者好…

加密的PDF文件怎么能够转换为word文档

Word是一种常见的文档格式&#xff0c;被广泛应用于办公室、教育等领域&#xff0c;目前它拥有较为丰富的文档编辑和格式化功能。然而&#xff0c;因为当前很多场景下&#xff0c;大多数资料文件都是以PDF格式存在&#xff0c;因为其具备比较强的稳定性&#xff0c;所以想要去修…

LearnOpenGL-光照章节学习笔记

LearnOpenGL-光照章节学习笔记 颜色创建一个光照场景 基础光照一、环境光照二、漫反射光照三、镜面反射 材质光照贴图一、漫反射贴图二、镜面光贴图三、放射光贴图 投光物一、平行光二、点光源衰减实现 三、聚光灯平滑边缘 多光源一、平行光&#xff08;定向光&#xff09;二、…

知识分享 | 详解整车区域控制器(ZCU)

随着智能网联汽车技术的迅猛发展&#xff0c;整车区域控制器ZCU&#xff08;Zone Control Unit&#xff09;作为汽车电子电气架构中的核心组件&#xff0c;其重要性日益凸显。ZCU不仅作为区域数据中心、IO中心及配电中心&#xff0c;在车辆动力、传感器管理、信息娱乐等方面发挥…

线性DP+摆渡车

线性DP&#xff1a; 具有线性“阶段”划分的动态规划算法称为线性DP。 线性DP无论状态表示是一维还是多维&#xff0c;DP算法在线性DP问题上都体现出了“作用在线性空间上的阶段划分和状态转移” &#xff0c;DP的阶段沿着各个维度线性增长。从一个或多个“初始状态”开始有方…

uni-app下Worker的使用

1、在static目录下创建一个目录用于存放worker文件 为啥要在static目录下创建worker目录呢&#xff1f;那是因为worker.js没办法在别的js中被引用&#xff0c;uni-app项目编译成微信小程序代码时会进行Tree-shaking&#xff08;摇树优化&#xff09;&#xff0c;把那些没被引用…

全方位教程:接入视频美颜SDK与直播美颜插件的完整步骤

今天&#xff0c;小编将为您详细介绍如何接入视频美颜SDK与直播美颜插件的完整步骤。 一、准备工作 开发环境的搭建 在开始集成之前&#xff0c;确保您的开发环境已配置完毕。无论是使用iOS、Android&#xff0c;还是Web开发&#xff0c;您都需要准备好对应的开发工具链&…

人工智能深度学习系列—深入探索KL散度:度量概率分布差异的关键工具

人工智能深度学习系列—深度解析&#xff1a;交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;在分类问题中的应用 人工智能深度学习系列—深入解析&#xff1a;均方误差损失&#xff08;MSE Loss&#xff09;在深度学习中的应用与实践 人工智能深度学习系列—深入探索KL…