[面试]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.rhkb.cn/news/469022.html

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

相关文章

Linux应用——线程池

1. 线程池要求 我们创建线程池的目的本质上是用空间换取时间,而我们选择于 C 的类内包装原生线程库的形式来创建,其具体实行逻辑如图 可以看到,整个线程池其实就是一个大型的 CP 模型,接下来我们来完成它 2. 整体模板 #pragma …

IDM扩展添加到Edge浏览器

IDM扩展添加到Edge浏览器 一般情况下,当安装IDM软件后,该软件将会自动将IDM Integration Module浏览器扩展安装到Edge浏览器上,但在某些情况下,需要我们手动安装,以下为手动安装步骤 手动安装IDM扩展到Edge浏览器 打…

docker 拉取MySQL8.0镜像以及安装

目录 一、docker安装MySQL镜像 搜索images 拉取MySQL镜像 二、数据挂载 在/root/mysql/conf中创建 *.cnf 文件 创建容器,将数据,日志,配置文件映射到本机 检查MySQL是否启动成功: 三、DBeaver数据库连接 问题一、Public Key Retrieval is not allowed 问题…

深入探索Waymo自动驾驶技术发展:从DARPA挑战赛到第五代系统的突破

引言 自动驾驶技术正引领着未来出行方式的革命,而Waymo作为全球自动驾驶领域的先锋,始终走在技术发展的最前沿。本文基于Waymo联席CEO德米特里多尔戈夫(Dmitri Dolgov)在No Priors节目中的访谈,全面介绍Waymo的技术发展…

鸿蒙移动应用开发-------初始arkts

一. 什么是arkts ArkTS是HarmonyOS优选的主力应用开发语言。 ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,保持了TS的基本风格,同时通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和…

c++ 输入三条边 绘制三角形

安装图形库 参考 #include "graphics.h" // 就是需要引用这个图形库 #include <conio.h> #include <stdio.h> #include <math.h>// 判断是否可以构成三角形 int isTriangle(int a, int b, int c) {return (a b > c) && (a c >…

A20红色革命文物征集管理系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

Logrus入门

Logrus入门 1. 下载 go get github.com/sirupsen/logrus2. logrus常用方法 logrus.Debugln("Debugln") logrus.Infoln("Infoln") logrus.Warnln("Warnln") logrus.Errorln("Errorln") logrus.Println("Println")// 输出如…

pyspark入门基础详细讲解

1.前言介绍 学习目标&#xff1a;了解什么是Speak、PySpark&#xff0c;了解为什么学习PySpark&#xff0c;了解课程是如何和大数据开发方向进行衔接 使用pyspark库所写出来的代码&#xff0c;既可以在电脑上简单运行&#xff0c;进行数据分析处理&#xff0c;又可以把代码无缝…

权限管理练习2

1.在/home中创建一个名为 file1.txt 的文件&#xff0c;并设置权限为&#xff1a;所有者和组成员可以读写&#xff0c;但其他人只能读。 所有者和组成员可以读写 u rw- g rw- o r-- 2.在 /home 目录下创建一个名为 shared 的子目录&#xff0c;使得所有用户都可以进入&#…

面试经典 150 题:121,125

121. 买卖股票的最佳时机 【参考代码】 动态规划解决 class Solution { public:int maxProfit(vector<int>& prices) {int size prices.size();int min_price 99999, max_profit 0;for(int i0; i<size; i){if(prices[i] < min_price){min_price prices[i…

数据集划分

1、 sklearn玩具数据集介绍 数据量小&#xff0c;数据在sklearn库的本地&#xff0c;只要安装了sklearn&#xff0c;不用上网就可以获取 2 sklearn现实世界数据集介绍 数据量大&#xff0c;数据只能通过网络获取&#xff08;科学上网&#xff09; 3 sklearn加载玩具数据集 示…

图形几何之美系列:仿射变换矩阵之先转后偏

“在几何计算、图形渲染、动画、游戏开发等领域&#xff0c;常需要进行元素的平移、旋转、缩放等操作&#xff0c;一种广泛应用且简便的方法是使用仿射变换进行处理。相关的概念还有欧拉角、四元数等&#xff0c;四元数在图形学中主要用于解决旋转问题&#xff0c;特别是在三维…

刷题强训(day05) -- 游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)

目录 1、游游的you 1.1 题目 1.2 思路 1.3 代码实现 2、腐烂的苹果 2.1 题目 2.2 思路 2.3 代码实现 3、孩子们的游戏(圆圈中最后剩下的数) 3.1 题目 3.2 思路 3.3 代码实现 3.3.1 环形链表 ​编辑3.3.2 动态规划 ​编辑 1、游游的you 1.1 题目 1.2 思路 根据题…

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接&#xff1a; [【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;](【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果&#xff0c;方便理…

并查集算法实现

模板 模板分为三大部分 初始化查询i的祖先合并i j(使他们祖先成为一个人) // 1 初始化 void init(int n) {for (int i 1; i < n; i)fa[i] i;//将该数的父节点定义为该数 }// 2 查询i的祖先 int find(int i) {if (i fa[i])return i;else{![查](../pic/并查集.png)fa[i]…

(实战)WebApi第13讲:怎么把不同表里的东西,包括同一个表里面不同的列设置成不同的实体,所有的给整合到一起?【前端+后端】、前端中点击标签后在界面中显示

一、实现全局跨域&#xff1a;新建一个Controller&#xff0c;其它的controller都继承它 1、新建BaseController 2、在后端配置&#xff0c;此处省略【详情见第12讲四、3、】 3、其它的控制器继承BaseController&#xff0c;这个时候就能够完成全局的跨域 【向后台传cookie和…

【计算机基础——数据结构——红黑树】

1. 红黑树&#xff08;RBTree&#xff09; 为什么HashMap不直接使用AVL树&#xff0c;而是选择了红黑树呢&#xff1f; 由于AVL树必须保证左右子树平衡&#xff0c;Max(最大树高-最小树高) < 1&#xff0c;所以在插入的时候很容易出现不平衡的情况&#xff0c;一旦这样&…

【MatLab手记】 --从0到了解超超超详过程!!!

文章目录 MatLab笔记一、命令行窗口二、变量命名规则三、数据类型1. 数字2. 字符与字符串3. 矩阵3.1 矩阵创建3.2 矩阵的修改和删除3.3 矩阵的拼接与重构重排3.4 矩阵的运算方法3.5 矩阵的下标 4. 元胞数组&#xff08;类似数据容器&#xff09;5. 结构体 四、逻辑与流程控制五…

Qt_day5_常用类

常用类 目录 1. QString 字符串类&#xff08;掌握&#xff09; 2. 容器类&#xff08;掌握&#xff09; 2.1 顺序容器QList 2.2 关联容器QMap 3. 几种Qt数据类型&#xff08;熟悉&#xff09; 3.1 跨平台数据类型 3.2 QVariant 统一数据类型 3.3 QStringList 字符串列表 4. QD…