Mysql经典面试题

news2024/11/16 17:48:33

***搜集到的一些有用的Mysql经典《八股文》,全篇手打,大家觉得有用的话点一个赞,持续更新

目录

1.Mysql锁的机制:

粒度分类:

思想分类:

实现分类: 

状态分类:


1.Mysql锁的机制:

 如上图所示我们将锁分为了五大部分进行理解,如果按照网上大多数博主那样上来一直说大白话显得很难读懂,索性我们按照分类来进行记忆,这样会显得更加清晰明了。

粒度分类:

全局锁:

定义:全局锁是对整个数据库实例加锁,它可以确保整个数据库处于只读状态,防止并发的写操作。

为什么要存在全局锁?

场景:当前我们需要对整个数据库表进行导出(假设当前以银行为背景,并且没有加全局锁),在我们导出sql文件的一瞬间,有人进行了消费,转账改变了原表数据(原用户表金额属性发生了变化),那么请问当前导出的sql文件是改呢?还是不改呢?

应用:

所以我们加上了全局锁就可以防止在导出表,或者恢复表的时候其他DDL语句对数据进行改变。

表级锁:

定义:表级锁是对数据表加锁,可以是读锁(共享锁)或写锁(排他锁)的形式。读锁之间不互斥,多个事务可以同时持有读锁;(在MYISAM中读操作,会自动加上读锁,写操作自动加上写锁,因为这个引擎不支持事务,所有他会加强行锁来保证稳定性,而在InnoDB中必要情况下会用表锁,大多情况用的是行锁,这个后面会解释)

为什么要存在表级锁?

在大多情况下用不着将全局整个数据库进行加锁,我们可能只需要对某个经常读写的表进行加锁即可,那么我们就会选择粒度小一点的表级锁。

应用:

1.读密集型应用(读多写少的时候)

2.数据量比较小

3.全表更新或删除

缺点:

1.降低性能(因为锁了整个表,当并发量高的时候会很慢,因为大家都在等)

2.锁超时(当一些操作长时间无法进行提交的时候)

3.死锁(两线程互相锁)

行级锁

定义:行级锁是对某行数据加锁,其他事务可以访问表中其他行而不被阻塞。行级锁可以是共享锁或排他锁,类似于读锁和写锁的概念,但是行级锁是针对单行数据的。(粒度最小,死锁发生概率最大,CPU和资源耗费最多的一个锁)

为什么要存在行级锁?

适用于高并发环境下对数据库中特定行进行读写操作,可以提高并发性能。

应用:

1.高并发读写

2.单行操作

3.insert.update.delete,这些操作都会有行锁(排他锁)

缺点:

1.锁冲突(会比上面行锁小一点)

2.死锁

3.内存消耗(cpu和资源是最大的,因为粒度最细)

思想分类:

所谓的乐观锁和悲观锁不过是一种思想。

乐观锁

定义:主打一个乐观,认为不会发生冲突,所以任何时候都不加锁,当多操作同时对一个数据进行修改的时候,能否成功修改在于修改时的version和修改前的version是否相同来保证,如果相同则进行修改并让version进行加一,如果不同则进行回滚重新等下一次操作机会(数据库里面没有乐观锁的具体实现,我们一般用版本号version进行判断,初始值为零,每次修改成功进行加一,version也是我们建立用户表或者商品表的一个重要字段

优点:

当并发量小的时候速度很快,因为我们任何时候都没有加锁,所以执行速度就会比较快

缺点:

相对于优点来说,如果并发量大的时候,同一时间涌进来了大量数据,但是一瞬间只有一个操作可以进行实现,其他的都需要等待,这个时间就会非常长。

应用:

比如说用户表,对于用户表来说大多时间我们都是一种读的形式,很少改,所以我们可以采用建立用户表的时候加入一个version字段进行乐观锁的表示。

悲观锁(并发机制)

定义:主打一个悲观,认为任何时候都会发生冲突,所以任何时候都会进行加锁,当多操作对同一数据修改的时候,可以保证数据的安全性和可靠性(mysql有实现方式,共享锁和排他锁都可以

优点:

1.数据安全性(串行化)

2.实现简单

缺点:

1.在并发情况下,大家会直接等,然后一个一个来

2.锁冲突和死锁风险高

应用:

强一致性的时候,这个是优于乐观锁的,因为乐观锁说白了是用回滚,而悲观锁是直接强行锁住一个一个来。

实现分类: 

共享锁(S锁/读锁),排他锁(X锁/写锁)--------这两个锁也是我们用的最多的两个锁

共享锁

定义:阻止用户进行更新修改数据,只允许读取数据。

特点:

共享锁允许多个事务同时持有锁,用于读操作。共享锁之间不会互斥,多个事务可以同时读取同一数据,不会互相干扰。

优点:

共享锁适用于并发度较高的读操作场景,可以提高并发性能。

缺点:

在持有共享锁的情况下,其他事务无法获取排他锁,从而阻塞了写操作的执行。

应用:

共享锁常被用于多个事务并发读取数据的情况,例如读取数据的查询操作。多个事务可以共享对数据的读取权限,不会相互冲突。

排他锁

定义:阻止用户进行读取数据,只允许修改操作数据。

特点:

排他锁只允许独占访问,用于写操作。在一个事务持有排他锁期间,其他事务无法获取共享锁或排他锁,从而确保数据的独占性。

优点:

排他锁适用于独占式的写操作,保证了数据的一致性和完整性。

缺点:

在持有排他锁的情况下,其他事务无法读取或修改数据,从而对并发性能产生影响。

应用:

排他锁常被用于修改数据的操作,例如插入、更新或删除操作。事务持有排他锁时,其他事务无法同时进行写操作,防止数据的并发冲突。

状态分类:

其实主要就是在实现(排他锁和共享锁)上加了一个意向锁,它是一个表锁,为了协调行锁和表锁的关系,支持多粒度(行锁和表锁)共存。

作用:当事务A已经存在行锁的时候,mysql会自动为其增加一个意向锁,事务B如果想申请表级写锁,那么就不需要在遍历每一行是否有行锁(因为表级写锁和行级写锁不共存),直接判断是否存在意向锁即可,大大提高了时间效率(如果没有意向锁,那么就会循环遍历,浪费shi'j)

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

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

相关文章

【雕爷学编程】Arduino动手做(130)---5A交流电流模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

Jetson Orin定制载板SPI接口调试记录

1.前言 按照如下步骤操作配置SPI,但仍无法正常工作 启用spi的步骤: (1)使用jetson-io为spi1启用40pin 座子 (2)编辑dts(把TPM(slb9670)设备通过spi 连接),并使用dtc工具将dts编译为dtb。 将TPM的reg设置为0x02。 (3)设置extlinux.conf的FDT (4)reboot 应该…

多张显卡之间通信方式

显卡之间常见的通信方式有以下几种 1.broadcast(广播):将一张卡上的数据传到其它所有的卡上(下图中的out就是等于in) 2. reduce(归约):将所有显卡上的数据,相加/取平均/…

【AcWing】夏季每日一题2023 -- 4908. 饥饿的牛 -- Java Version

题目链接:https://www.acwing.com/problem/content/description/4911/ 1. 题解(4908. 饥饿的牛) y总视频讲解:https://www.acwing.com/video/4739/ 1.1 顺序遍历:区间计算 ⭐ 时间复杂度O(1),空间复杂度O…

简单电感量测量装置电路设计

在电子制作和设计,经常会用到不同参数的电感线圈,这些线圈的电感量不像电阻那么容易测量,有些数字万用表虽有电感测量挡,但测量范围很有限。该电路以谐振方法测量电感值,测量下限可达 10nH,测量范围很宽&am…

iNav开源代码之AOCODARCH7DUAL蜂鸣器持续蜂鸣问题

iNav开源代码之AOCODARCH7DUAL蜂鸣器持续蜂鸣问题 1. 源由2. 分析2.1 逻辑分析2.2 接线连接2.3 动态测量2.4 软件配置2.5 现象分析2.6 对比分析 3. 总结4. 参考资料 1. 源由 最近上了iNav 6.1.1固件,总体感觉非常不错。但是出现了一个百思不得其解的蜂鸣器持续蜂鸣…

让MBR使用硬盘

前提知识: BIOS中断 BIOS 和 DOS 都是存在于实模式下的程序,由它们建立的中断调用都是建立在中断向量表(Interrupt Vector Table,IVT)中的。它们都是通过软中断指令 int 中断号来调用的。中断向量表中第 0H&#xff…

关于30KW储能PCS逆变器的设计方案。它包括双向DCDC和三电平逆变PCS

关于30KW储能PCS逆变器的设计方案。它包括双向DCDC和三电平逆变PCS。资料中提供了仿真源码,其中包含并网和离网两个模型 30KW储能PCS逆变器双向变流器设计方案资料 1.此系列为30KW储能PCS逆变器设计方案资料,双向DCDC和三电平逆变PCS; 2.仿真…

使用Android Jetpack Compose构建菜单(Menu)

Android Jetpack Compose是一种现代化的声明式UI工具,它让构建美观且功能强大的界面变得更加简单和直观。在本文中,我们将介绍如何使用Jetpack Compose构建一个简单的下拉菜单。 一、什么是下拉菜单? 下拉菜单是一种用户界面元素&#xff0…

无迹卡尔曼滤波在目标跟踪中的作用(二)

在上一节的内容中,我们介绍了UKF中最重要的内容—无迹变换UT,今天我们将具体介绍UKF是如何实现的。 好了,话不多说,开整!!! UKF算法的实现 我们知道,我们可以使用状态方程和观测方…

04 Web全栈 闭包/this指针

专业术语 变量、常量、数据类型形参、实参匿名函数、具名函数、自执行函数函数声明、函数表达式堆、栈同步、异步、进程、线程 执行上下文 当函数执行时,会创建一个执行上下文的环境,分为创建和执行两个阶段 创建阶段 创建阶段,指函数被调…

Android开发有必要深耕Framework吗?该如何着手?

前言 前段时间朋友在找 Android 高级开发工作,想进一步提升自己的能力,看了很多招聘信息,都要求熟练掌握 Framwork,了解底层原理等,发现是不是该深入研究底层技术…… 同时在网上也看到过相关问题,有很多…

iOS应用上架指iOS应用上架指南:综合详解

目录 引言 一、基本需求信息。 二、证书 一.证书管理 二.新建证书 三.使用appuploader服务同步证书 三、打包 三、审核 四、整体架构流程 五、代码实现 六、总结 转载自iOS开发上架的文章:iOS应用全面上架指南 引言 上架IOS应用到app store,…

An unexpected connection driver error occured

安装下载好rabbitmq,我在springboot整合mq,启动的时候报错了 An unexpected connection driver error occured 后来又报 Failed to check/redeclare auto-delete queue(s). 综合就是连接问题,端口有问题 我试过添加账户,提高权限&…

Docker 环境安装

博文目录 文章目录 CentOS 安装 Docker Engine安装 Docker升级 Docker卸载 Docker阿里云镜像加速 使用 DNF 命令安装最新 Docker Docker 官方文档 下载与安装 Linux 版本选择 Docker 官方文档 下载与安装 CentOS CentOS 安装 Docker Engine 安装 Docker 卸载旧版。卸载docke…

充分条件、必要条件

关于对充分条件、必要条件、充要条件的最简单扼要的理解: 充分条件:有A就一定有B,则A是B的充分条件; 必要条件:无A就一定无B,则A是B的必要条件; 充要条件:有A就一定有B&#xff0…

(区间dp)牛客·分离与合体

别人写dfs&#xff0c;我写bfs&#xff0c;个人觉得对于这个题bfs更好理解。 思路都大同小异啦…… 1、dp[i][j]:第i到第j获得最大的价值 2、p[i][j]:第i到第j获得最大价值时(i-k-j)&#xff0c;记录值k 3、bfs求路径&#xff0c;层次遍历嘛#include<bits/stdc.h> using…

精通 H.264,从压缩原理到前沿应用的全方位了解

H.264&#xff0c;也称为 AVC&#xff08;Advanced Video Coding&#xff09;&#xff0c;是一种广泛使用的视频编码标准。它是一种高效的压缩算法&#xff0c;可用于对音频和视频数据进行高质量的压缩和编码。以下是关于 H.264 编码的一些重要信息&#xff1a; 压缩原理&…

机器学习笔记 - 结合深度学习的基于内容的图像实例检索 通过学习DCNN表示进行检索

一、概述 上一篇,利用现成的DCNN模型进行检索。 机器学习笔记 - 结合深度学习的基于内容的图像实例检索 利用现成的DCNN模型进行检索_坐望云起的博客-CSDN博客一种方案是,为分类任务而进行大规模训练的DCNN直接充当图像检索任务的现成特征检测器,也就是说,可以提出在DCNN的…