[面试]Mysql的锁机制

一、锁的基本概念

        MySQL中的锁主要用于控制多个事务对数据库资源的并发访问,以确保数据的一致性和完整性。锁机制是数据库并发控制的核心,通过锁定数据库中的资源来防止并发操作引发的数据冲突。

二、锁的分类

MySQL的锁按照作用范围可以分为表级锁和行级锁两大类。

1.表级锁(Table Locks)
  • 作用于整张表,开销较小,但并发度较低。
  • 主要用于MyISAM存储引擎。
  • 包括共享锁(读锁)和排他锁(写锁)两种类型。
  • 共享锁(Shared Lock/Read Lock):允许多个事务同时读取同一表的数据,但不允许修改。,适用于并发读取操作。使用语法:LOCK TABLES tableName READ
  • 排他锁(Exclusive Lock/Write Lock):禁止其他事务对被锁定的表进行读或写操作。适用于更新和删除操作,可以确保数据的一致性和完整性,使用语法:LOCK TABLES tableName WRITE

        表锁是一种较粗粒度的锁机制,会锁定整个表,而不是某个具体的行或记录。因此,在高并发的情况下,表锁可能会导致性能问题,并且可能造成阻塞。

2.行级锁(Row Locks)
  • 作用于表中的某一行或多行,开销较大,但并发度高。
  • 行锁是最精细的锁类型,它锁定的是表中的具体数据行。
  • 主要用于InnoDB存储引擎。
  • 记录锁(Record Lock)
    • 只锁定单条索引记录,是最基本的行锁。
    • 适用于对单行数据进行增删改操作的场景。
  • 间隙锁(Gap Lock)
    • 锁定索引之间的间隙,防止其他事务在索引之间插入新数据。
    • 主要用于范围查询和防止幻读。
  • 临键锁(Next-Key Lock)
    • 是记录锁和间隙锁的组合,既锁定记录本身,也锁定索引之间的间隙。
    • 解决了幻读问题,是InnoDB的默认行锁策略。

        行锁允许多个事务在同一个表中并发执行不同行上的操作,而不会互相阻塞,因此具有较高的并发性。但相比于表锁,行锁需要更多的资源来维护锁的状态,开销更大。

三、其他锁类型

        除了表级锁和行级锁,MySQL还提供了其他类型的锁来支持不同的并发控制需求。

1.全局锁

  • 用于保护整个数据库实例的锁,是MySQL中最高级别的锁。
  • 在备份、恢复或执行某些维护任务时使用,以确保数据库的完整性。
  • 使用语法:FLUSH TABLES WITH READ LOCK;

2.元数据锁(Meta Data Lock, MDL)

  • 用于保护数据库的元数据,如表、列、索引等对象的定义和属性。
  • 在对表结构进行变更操作时,会加MDL写锁(排他锁);在普通查询时,会加MDL读锁(共享锁)。

3.意向锁(Intention Locks)

  • InnoDB特有的锁,用于提高行级锁和表级锁的兼容性。
  • 分为意向共享锁(IS)和意向排他锁(IX)两种类型。
  • 意向共享锁(IS):表示一个事务打算对某些行加共享锁。
  • 意向排他锁(IX):表示一个事务打算对某些行加排他锁。

4.间隙锁(Gap Locks)

  • 在索引记录之间的间隙上加的锁,用于防止其他事务插入到间隙中。
  • 只适用于可重复读(Repeatable Read)和串行化(Serializable)隔离级别。

5.临键锁(Next-Key Locks)

  • 是索引记录上的记录锁和索引记录前的间隙锁的组合。
  • 适用于可重复读(Repeatable Read)和串行化(Serializable)隔离级别。

6.插入意向锁(Insert Intention Locks)

  • 由INSERT操作设置的一种间隙锁,表明有事务想在某个间隙中插入新记录。
  • 是一种短锁,插入语句执行完成后会立即释放。

7.AUTO-INC锁

  • 一种特殊的表级锁,由插入具有AUTO_INCREMENT列的表的事务获取。
  • 用于保证自增列的顺序生成。

四、锁机制优化策略

  1. 优先使用行级锁:如果并发读写操作频繁,建议使用InnoDB的行级锁,避免使用表级锁。
  2. 避免大范围锁定:确保SQL查询只锁定必要的数据行,避免在事务中锁定过多行或整个表。
  3. 缩短事务时间:事务时间越长,锁持有的时间也越长,锁竞争就越严重。因此,应尽量缩短事务的执行时间。
  4. 优化索引和查询:通过创建合适的索引和优化查询条件,减少全表扫描和锁争用的发生。
  5. 选择合适的隔离级别:不同的隔离级别提供了不同的并发控制和数据一致性保证。应根据实际需求选择合适的隔离级别。
  6. 使用覆盖索引:覆盖索引可以减少锁定的数据行数,提高并发性能。
  7. 读写分离和分区表:在高并发环境下,采用读写分离和分区表是有效的锁优化策略。
  8. 乐观锁:在高并发、冲突较少的场景下,可以考虑使用乐观锁来控制并发。

五、锁相关的问题及解决

  1. 死锁:当多个事务相互等待对方持有的锁时,会发生死锁。InnoDB具备自动死锁检测机制,会回滚其中一个事务以解锁死锁状态。开发者应尽量避免长时间持有锁和不合理的事务顺序设计。
  2. 锁等待时间过长:如果一个事务等待锁的时间过长,会影响系统的性能。可以通过调整锁等待超时时间、优化SQL查询等方法来解决。

        综上,MySQL的锁机制是数据库并发控制的核心。了解并掌握MySQL的锁机制对于设计高效、可靠的数据库应用程序至关重要。

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

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

相关文章

计算2000-2100年,阳历11月11日,与阴历10月1日重叠的年份

# 计算2000-2100年,阳历11月11日,与阴历10月1日重叠的年份from datetime import datetime from lunardate import LunarDatedef find_matching_years(start_year, end_year):matching_years []for year in range(start_year, end_year 1):solar_date …

JVM学习之路(5)垃圾回收

目录 Java垃圾回收 方法区回收 方法区的回收 堆内存回收 引用计数法和可达性分析算法 查看GC Root 五种对象引用 软引用 ​编辑 弱引用 虚引用和终结器引用 垃圾回收算法: 垃圾回收算法的历史和分类 垃圾回收算法的评价标准 标记清除算法 复制算法 标记整理算法 分代…

ubuntu 20.04 NVIDIA驱动、cuda、cuDNN安装

1. NVIDIA驱动 系统设置->软件和更新->附加驱动->选择NVIDIA驱动->应用更改。该界面会自动根据电脑上的GPU显示推荐的NVIDIA显卡驱动。 运行nvidia-smi: NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the lat…

docker如何实时查看项目的日志

1. 使用docker logs命令 基本语法和原理:docker logs命令用于获取容器的日志输出。默认情况下,它会显示容器启动后到当前时间的所有日志内容。当你在容器内的应用程序将日志输出到标准输出(stdout)或标准错误输出(std…

Ubuntu18.04+ROS环境+moveit UR5机械臂仿真

目录 仿真环境: 1.下载Universal Robots机器人功能包 2.运行 Gazebo中的仿真模型 3.运行moveit运动规划 4.运行rviz并进行轨迹规划 仿真环境: 本文使用版本:Ubuntu18.04 ros版本:ros-melodic-desktop-full,安装…

C++11新特性(二)

目录 一、C11的{} 1.初始化列表 2.initializer_list 二、可变参数模版 1.语法与原理 2.包扩展 3.empalce接口 三、新的类功能 四、lambda 1.语法 2.捕捉列表 3.原理 五、句装器 1.function 2.bind 一、C11的{} 1.初始化列表 C11以后想统⼀初始化⽅式&#xff0…

python获取iOS最近业务日志的两种方法

当iOS UI自动化用例执行失败的时候,需要获取当时的业务日志,供后续分析使用。 现在已经把iOS沙盒目录挂载到本地,剩下的事情就是从沙盒目录中捞取当前的日志,沙盒中的日志文件较大,整体导出来也可以,但是会…

Flutter 小技巧之 Shader 实现酷炫的粒子动画

在之前的《不一样的思路实现炫酷 3D 翻页折叠动画》我们其实介绍过:如何使用 Shader 去实现一个 3D 的翻页效果,具体就是使用 Flutter 在 3.7 开始提供 Fragment Shader API ,因为每个像素都会过 Fragment Shader ,所以我们可以通…

实现3D热力图

实现思路 首先是需要用canvas绘制一个2D的热力图,如果你还不会,请看json绘制热力图。使用Threejs中的canvas贴图,将贴图贴在PlaneGeometry平面上。使用着色器材质,更具json中的数据让平面模型 拔地而起。使用Threejs内置的TWEEN&…

风险数据集市整体架构及技术实现

引言 在当今大数据时代,风险数据集市作为金融机构的核心基础设施之一,扮演着至关重要的角色。它不仅为银行、保险等金融机构提供了全面、准确的风险数据支持,还帮助这些机构实现了风险管理的精细化和智能化。本文将深入探讨一种基于大数据La…

使用k8s RBAC和ValidatingAdmissionPolicy 配合来校验用户权限

我先讲一下业务场景: k8s集群内部有几个重要的命名空间(比如: kube-system, kube-public 等),这些命名空间除了管理员有权限,其他用户不可以操作(编辑,删除)这几个命名空…

2. Sharding-JDBC广播表和绑定表操作

1. 广播表实战 ⼴播表概念 1. 指所有的分⽚数据源中都存在的表,表结构和表中的数据在每个数据库中均完全⼀致。 2. 适⽤于数据量不⼤且需要与海量数据的表进⾏关联查询的场景。 3. 例如:字典表、配置表。注意 1. 分库分表中间件,对应的数据…

【C++打怪之路Lv13】- “继承“篇

🌈 个人主页:白子寰 🔥 分类专栏:重生之我在学Linux,C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~ 💡 坚持…

【科研积累】大模型的认知笔记

1 认识大模型 大模型是人工智能发展的一个里程碑,人工智能包括机器学习,机器学习包括监督学习、无监督学习和强化学习,深度学习神经网络也是机器学习的一个分支,生成式人工智能是深度学习的一个子集,ChatGPT和Stable …

【面试分享】xshell连接Linux服务器22端口执行命令top期间的技术细节和底层逻辑

通过SSH客户端(如Xshell)连接到服务器的22端口并执行top命令,涉及多个技术细节和底层逻辑。以下是对这一过程的详细解释: 一、技术细节 SSH协议: SSH(Secure Shell)是一种网络协议,…

mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误

1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量(我的是在~/.bash.profile) export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…

自动驾驶系列—自动驾驶中的短距离感知:超声波雷达的核心技术与场景应用

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

体育活动赛事报名马拉松微信小程序开发

功能描述 体育活动赛事报名马拉松微信小程序,该项目是一个体育活动报名小程序,主要功能有活动报名、扫码签到、签到积分、排行奖励、积分兑换等功能。 用户端🔶登录:◻️1.微信授权登录 ◻️2.手机号码授权 🔶首页&am…

uniapp框架配置项pages.json

uniapp框架配置项pages.json pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 globalStyle 全局配置 用于设置应用的状态栏、导航条、标题、窗口背景色等。下面配置项默认应用于每个页面。 注意…

linux中kubectl命令使用

一.命令介绍 kubectl 是 Kubernetes 集群管理的命令行工具,用于与 Kubernetes API 交互。你可以通过它来管理和操作 Kubernetes 集群中的资源,如 Pod、Deployment、Service 等。下面是如何在不同操作系统上下载和使用 kubectl 的方法。 二.下载 kubect…