事务和索引(面试常问)

面试常问:

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

答: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.rhkb.cn/news/393516.html

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

相关文章

sed 简易使用指南

sed 简易使用指南 1 sed 介绍2 查找3 替换4 反向引用5 删除6 cai&#xff08;菜&#xff09; 导言&#xff1a; 笔者之前花了较多时间学习并整理了sed命令相关的内容&#xff0c;以及一些进阶内容。但是&#xff0c;到后来使用也就只记得那么几个简单的选项&#xff0c;再高级的…

6-8 残差网络(ResNet)

随着我们设计越来越深的网络&#xff0c;深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力&#xff0c;在这种网络中&#xff0c;添加层会使网络更具表现力&#xff0c; 为了取得质的突破&#xff0c;我们需要一些数学基础知识。 残差网络…

【虚拟化】KVM使用virt-manager部署及管理虚拟机

目录 一、KVM 概述 二、KVM工作原理 三、部署KVM 四、新建虚拟机步骤 4.1 创建存储池并创建存储卷 4.1.1 创建存储池 4.1.2 创建存储卷 4.3 创建ISO存储池 4.4 生成新的虚拟机 一、KVM 概述 KVM 是 Kernel-based Virtual Machine 的缩写&#xff0c;是一种用于虚拟化的…

大模型微调深入研究

在本博文系列的前一部分中&#xff0c;我们探讨了情境学习的概念&#xff0c;这是一种克服大型语言模型 (LLM) 的“舒适区”限制的强大方法。我们讨论了如何使用这些技术来转换任务并将其移回模型的专业领域&#xff0c;从而提高性能并与有用性、诚实性和无害性的关键设计原则保…

WebBench源码分析

WebBench 源码解析 一、前言 WebBench 作为一款网站性能测试工具&#xff0c;其源码蕴含着丰富的技术细节和逻辑流程。本文将深入剖析其安装编译过程以及关键函数的核心逻辑。 二、安装编译 1. 克隆代码到本地仓库 git clone https://github.com/EZLippi/WebBench.git2. 编…

使用 Squid 搭建 Http 代理服务器隐藏 IP

在一些情况下&#xff0c;需要变更自己的访问 IP&#xff0c;可以通过 Squid 搭建代理服务器实现。 本文使用的是 CentOS 7.6 系统。 一、部署 Squid 安装 Squid。 yum install squid -y启动服 systemctl start squid二、访问控制 总有刁民想害郑&#xff0c;疯狂访问朕的…

基于宝塔面板稳定快速安装 ssl 证书脚本

背景 我通过AI制作了不少关于签发ssl证书的脚本&#xff0c;目的是方便无脑安装&#xff0c;不需要懂代码。 但全都是基于acme.sh这个工具来设计的脚本&#xff0c;而且证书申请有点慢&#xff0c;有时还会申请失败。 然后我发现了certbot, 安装证书可谓神速&#xff01; c…

ASP.NET Core基础 - 简介

目录 一. 简介 A、跨平台性 B、高性能 C、开源性 D、模块化与可扩展性 E、集成现代前端技术 二. ASP.NET 4.x 和 ASP.NET Core 比较 A、架构与平台支持 B、性能 C、开发体验 D、社区支持与生态系统 三. NET 与 .NET Framework 比较 A、概念范围 B、跨平台能力 C…

基于JAVA的高考智能排考场系统设计与实现,源码、部署+讲解

绪 论 随着教育规模的不断扩大和技术的进步&#xff0c;传统的考试管理方式面临着诸多挑战&#xff0c;如考试安排的复杂性、作弊现象的频发以及考试过程中的监督和管理等问题。因此&#xff0c;针对这些挑战&#xff0c;智能排考系统应运而生。 智能排考系统利用先进的技术…

数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)

文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出&#xff0c;对于需要动态维护的散列表冲突是不可避免的&#xff0c;无论你的散列函数设计的有多么精妙&#xff0c;因此我们不得不回答的第二个重要问题就是一旦发生冲突&…

零售EDI:OBI欧倍德EDI项目案例

OBI欧倍德公司是德国建材和家居装饰零售连锁店&#xff0c;在德国以及其他欧洲国家拥有众多分店&#xff0c;是欧洲领先的DIY&#xff08;Do It Yourself&#xff09;零售商之一。为了更好地处理与全球供应商之间的业务数据往来&#xff0c;OBI采用EDI提高其供应链的自动化水平…

基于微信小程序的宠物服务平台(系统源码+lw+部署文档+讲解等)

文章目录 目录 详细视频演示 系统详细设计截图 微信小程序系统的实现 1.1系统前台功能的实现 2.1微信小程序开发环境搭建 2.2微信开发者工具 2.3程序应用相关技术和知识 2.3.1小程序目录结构以及框架介绍 2.3.2 Java技术 2.3.3 MySQL数据库 2.3.4 SSM框架 源码获…

Pygame制作简单的跑酷游戏

今天我们来看看如何使用Pygame框架制作一个简单的跑酷游戏。这个游戏包含了基本的游戏元素,如玩家角色、障碍物、背景、音效等,可以作为入门Pygame游戏开发的一个不错的示例。 游戏概述 这是一个简单的横版跑酷游戏,玩家控制一个忍者角色,通过跳跃来躲避迎面而来的各种障碍物…

【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信

文章目录 前言 背景介绍 SCI通信 Transmitter Receiver SCI中断 分析和应用 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 背景介绍 近期使用TI C2000 DSP做的一个嵌入式系统开发项目中&#xff0c;在使用它的SCI&…

Pytorch系列-张量的类型转换

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 张量转换为NumPy数组 使用Tensor.numpy()函数可以将张量转换为ndarray数组 # 1.将张量转换为numpy数组 data_tensortorch.tensor([2,3,4]) # 使用张量对象中的numpy函数进行转…

c++STL中list介绍,模拟实现和list与vector对比

目录 前言 &#xff1a; 1. list的介绍及使用 1.1list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 2. list的模拟实现 3. list与vector的对…

串行并行数据转换

前言 串行数据传输通常在数据传输距离较远时使用&#xff0c;而并行数据传输适用于短距离、高速数据交换。通过转换&#xff0c;可以根据实际需求选择合适的传输方式&#xff0c;以优化数据传输效率和速度。串行数据传输在长距离传输中可以减少信号的干扰和失真&#xff0c;因为…

springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice

一、 背景 因为项目中需要使用word转pdf功能&#xff0c;因为转换速度原因&#xff0c;最后选用了libreoffice&#xff0c;原因及部署请参考 linux ubuntu环境安装libreoffice&#xff0c;word转pdf 远程调用的话可选docker部署&#xff0c;请看2.3.1 二、springboot整合libr…

达梦数据库的系统视图v$mem_pool

达梦数据库的系统视图v$mem_pool 达梦数据库的V$MEM_POOL视图主要用于显示所有内存池的信息。通过查询这个视图&#xff0c;用户可以监控数据库中各个内存组件的使用状况&#xff0c;包括内存池的大小、使用情况等。这有助于用户判断内存池是否空闲或紧张&#xff0c;从而进行…

【机器人学】6-4.六自由度机器人运动学参数辨识-机器人精度验证【附MATLAB代码】

前言 前两个章节以及完成了机器人参数辨识。 【机器人学】6-1.六自由度机器人运动学参数辨识-辨识数学模型的建立 【机器人学】6-2.六自由度机器人运动学参数辨识-优化方法求解辨识参数 标定了工具端、基座以及机器人本身的DH参数。那么我们的机器人精度如何呢&#xff1f;机…