金三银四面试题(十九):MySQL中的锁

在MySQL中,锁是非常重要的,特别是在多用户并发访问数据库的环境中,因此也是面试中常问的话题。

请说说数据库的锁?

关于MySQL 的锁机制,可能会问很多问题,不过这也得看面试官在这方面的知识储备。
MySQL 中有共享锁和排他锁,也就是读锁和写锁。

  1. 共享锁:不堵塞,多个用户可以同一时刻读取同一个资源,相互之间没有影响。
  2. 排他锁:一个写操作阻塞其他的读锁和写锁,这样可以只允许一个用户进行写入,防止其他
    用户读取正在写入的资源。
  3. 表锁:系统开销最小,会锁定整张表,MyISAM 使用表锁。
  4. 行锁:容易出现死锁,发生冲突概率低,并发高,InnoDB 支持行锁(必须有索引才能实现,
    否则会自动锁全表,那么就不是行锁了)。

说说什么是锁升级?

  1. 行锁只能加在索引上:
    MySQL的InnoDB存储引擎使用的是行级锁。当对表中的某一行进行操作(如更新或删除)时,InnoDB会尝试在该行上加锁以确保数据的一致性。然而,这种行级锁只能加在索引上。因为InnoDB使用B+树来组织索引,而行数据存储在索引的叶子节点中。因此,要锁定某行数据,必须先定位到该行所在的索引,然后在该索引上加锁。

  2. 不走索引会升级为表锁:
    如果执行的操作不走索引,而是对整个表或者大部分行进行扫描,MySQL无法定位到要加锁的行所在的索引,因此无法使用行级锁。这时,MySQL会将锁升级为表级锁,以确保操作的原子性和一致性。表级锁会锁定整个表,会对并发性能造成较大的影响,因为其他事务需要等待锁释放才能进行操作。

  3. InnoDB的索引结构和行锁原理:
    InnoDB在B+树的叶节点上同时保存了索引键值和相应的行数据。这意味着,当通过索引查找行数据时,可以直接定位到叶子节点,而不需要再次查找数据行,从而提高了查询效率。因此,InnoDB一定会有一个主键索引(primary key index),而其他辅助索引(secondary index)也是通过找到对应的主键值来进一步定位到相应的数据行。这也是为什么只有在索引上加锁才能使用行级锁的原因。

  4. 当非唯一索引上记录数超过一定数量时,行锁也会升级为表锁。测试发现当非唯一索引相同的内容不少于整个表记录的二分之一时会升级为表锁。因为当非唯一索引相同的内容达到整个记录的二分之一时,索引需要的性能比全文检索还要大,查询语句优化时会选择不走索引,造成索引失效,行锁自然就会升级为表锁。

说说悲观锁和乐观锁

悲观锁

说的是数据库被外界(包括本系统当前的其他事物以及来自外部系统的事务处理)修改保持着保守态度,因此在整个数据修改过程中,将数据处于锁状态。悲观的实现往往是依靠数据库提供的
锁机制,也只有数据库层面提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统汇总实现了加锁机制,也是没有办法保证系统不会修改数据。在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定。读取数据时给加锁,其他事务无法修改这些数据。修改删除数据时也要加锁,其他事务无法读取这些数据。

乐观锁

相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(Version)记录机制
实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新
时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

怎样尽量避免死锁的出现?

  1. 设置获取锁的超时时间,至少能保证最差情况下,可以退出程序,不至于一直等待导致死锁;
  2. 设置按照同一顺序访问资源,类似于串行执行;
  3. 避免事务中的用户交叉;
  4. 保持事务简短并在一个批处理中;
  5. 使用低隔离级别;
  6. 使用绑定链接。

往期推荐

金三银四面试题(十七):MySQL面试都问什么(2)2024-04-07
MySQL基础练习题:习题2-32024-04-07
MySQL基础练习题:创建数据库2024-04-07
金三银四面试题(十六):MySQL面试都问什么(1)2024-04-07
金三银四面试题(十六):MySQL面试都问什么(1)2024-04-06
金三银四面试题(十五):Java基础问题(6)2024-04-05
金三银四面试题(十四):Java基础问题(5)2024-04-04
金三银四面试题(十三):Java基础问题(4)2024-04-03
金三银四面试题(十二):Java基础问题(3)2024-04-02
金三银四面试题(十一):Java基础问题(2)2024-04-01

在这里插入图片描述

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

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

相关文章

深入了解Redis——持久化

一,Redis持久化 Redis持久化即将内存中的数据持久化到磁盘中,在下一次重启后还能进行使用,Redis持久化分为RDB和AOF两种,我们接下来分别介绍RDB和AOF的内部原理和区别 RDB Redis运行时会将当前的内存快照存入至磁盘中&#xff…

./build/examples/openpose/openpose.bin在windows中调用

直接看这个更简单的方法:https://blog.csdn.net/weixin_45615730/article/details/137591825?spm1001.2014.3001.5501 问题描述: 在跑pifuhd,需要两个输入,一个图片,一个关键点json文件。这是人家给的例子&#xff0…

【Linux】tcpdump P1 - 网络过滤选项

文章目录 选项 -D选项 -c X选项 -n选项 -s端口捕获 port选项 -w总结 tcpdump 实用程序用于捕获和分析网络流量。系统管理员可以使用它来查看实时流量或将输出保存到文件中稍后分析。本文将演示在日常使用 tcpdump时可能想要使用的几种常见选项。 选项 -D 使用-D 选项的 tcpdu…

中文域名有必要注册吗?

随着互联网的普及和全球化,中文域名作为一种新兴的网络标识,逐渐进入了公众的视野。中文域名,顾名思义,是以中文字符为主要组成部分的域名,它允许用户直接使用中文来访问网站,而不需要记忆或输入一串英文字…

并发基础面试题第一篇

1.为什么要使用并发编程 提升多核CPU的利用率:一般来说一台主机上会有多个cpu核心,我们可以创建多个线程,理论上讲操作系统可以将多个线程分配给不同的CPU执行,每个CPU执行一个线程,这样就提高了CPU的使用效率。 简单…

怎么开发一个预约小程序_一键预约新体验

预约小程序,让生活更便捷——轻松掌握未来,一键预约新体验 在快节奏的现代生活中,我们总是在不断地奔波,为了工作、为了生活,不停地忙碌着。然而,在这繁忙的生活中,我们是否曾想过如何更加高效…

邮件群发提高成功率的技巧?如何群发邮件?

邮件群发有哪些注意事项?怎么有效分析邮件群发效果? 邮件群发已经成为一种高效的信息传递手段。然而,很多人发现,尽管发送了大量的邮件,但回应率却并不理想。那么,如何才能在邮件群发中提高成功率呢&#…

【flutter启动分析】

flutter启动分析的入口: void main() {runApp(const MyApp()); } main函数会调用runapp(); void runApp(Widget app) { //生成对象给下面两个领域 //Flutter Framework ---调用到---胶水对象---》Flutter 的C++ Engine(so库这种)final WidgetsBinding binding = WidgetsF…

Oracle小机利用ZFS实现在线存储迁移

1.ZFS介绍 2004年:Sun Microsystems 开始研发 ZFS 文件系统。ZFS 最初是作为 Solaris 操作系统的一部分而开发的,旨在解决传统文件系统的一些限制和问题。 2010年:Oracle 收购了 Sun 公司,从而获得了 ZFS 文件系统的所有权和控制权…

node 中的 nextTick 和 vue 中的 nextTick 的区别

node 中的 nextTick node 中的 nextTick 是 node 自带全局的变量 process 的一个方法,process.nextTick 是一个微任务,在 node 的所有微任务中最先执行,是优先级最高的微任务。浏览器中是没有这一个方法的。 vue 中的 nextTick vue 中的 n…

只为兴趣,2024年你该学什么编程?

讲动人的故事,写懂人的代码 当你想学编程但不是特别关心找工作的时候,选哪种语言学完全取决于你自己的目标、兴趣和能找到的学习资料。一个很重要的点,别只学一种语言啊!毕竟,"门门都懂,样样皆通",每种编程语言都有自己的优点和适合的用途,多学几种可以让你的…

鸿蒙开发 一 (二)、熟悉鸿蒙之剑 ArkTS

ArkTS是HarmonyOS主要应用开发语言,以后也别在弄那个 java 和鸿蒙的混合版了, 没必要浪费时间, 一步到位, 学新的吧。 简介 ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,保…

网络工程师(强化训练)-网络互联与互联网

网络工程师 以下关于OSPF路由协议的描述中,错误的是向整个网络中每一个路由器发送链路代价信息。相比于TCP,UDP的优势为开销较小。以太网可以传送最大的TCP段为1480字节。IP数据报经过MTU较小的网络时需要分片。假设一个大小为1500字节的报文分为2个较小…

【如何应用OpenCV对图像进行二值化】

使用OpenCV进行图像二值化是一个常见的图像处理任务。以下是一个简单的步骤说明,以及相应的Python代码示例。 步骤说明: 读取图像:首先,使用OpenCV的imread函数读取图像。灰度化:将彩色图像转换为灰度图像&#xff0…

LeetCode 1702.修改后的最大二进制字符串:脑筋急转弯(构造,贪心)

【LetMeFly】1702.修改后的最大二进制字符串:脑筋急转弯(构造,贪心) 力扣题目链接:https://leetcode.cn/problems/maximum-binary-string-after-change/ 给你一个二进制字符串 binary ,它仅有 0 或者 1 组…

Day 20 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉…

【鸿蒙千帆起】《开心消消乐》完成鸿蒙原生应用开发,创新多端联动用户体验

《开心消消乐》已经完成鸿蒙原生应用开发,乐元素成为率先完成鸿蒙原生应用开发的20游戏厂商之一。作为一款经典游戏,《开心消消乐》已经拥有8亿玩家,加入鸿蒙原生应用生态,将为其带来更优的游戏性能和更多创新体验。自9月25日华为…

中国500米分辨率月最大EVI数据集

增强型植被指数(EVI)是在归一化植被指数(NDVI)改善出来的,根据大气校正所包含的影像因子大气分子、气溶胶、薄云、水汽和臭氧等因素进行全面的大气校正,EVI大气校正分三步,第一步是去云处理。第…

结构体和结构体指针的区别

1.定义区别 结构体的定义如下: struct 结构体名 {数据类型 成员变量名1;数据类型 成员变量名2;// 可以有更多的成员变量 };例如,定义一个表示学生的结构体: struct Student {int id;char name[20];int age; };上述定义了一个名为Student的…

Glide系列-自定义ModuleLoader

在当今快速发展的移动应用领域,图片的高效加载和显示对于提供流畅用户体验至关重要。Glide作为一款强大的图片加载库,已经成为Android开发者的首选工具之一。但是,你有没有遇到过Glide默认不支持的模型类型,或者需要对图片加载过程…