【MySQL数据库 | 第二十二篇】深入了解MySQL锁

前言:

MySQL作为世界上最流行的关系型数据库管理系统之一,广泛应用于各种规模和类型的应用程序中。在处理高并发和大规模数据操作时,确保数据的一致性和完整性是至关重要的。而MySQL的锁机制正是在这样的背景下发挥着重要作用。

MySQL锁机制涉及到数据库并发控制的核心概念,它可以保证多个会话(连接)对数据库中数据的读写操作不会相互干扰,从而确保了数据的正确性和可靠性。然而,锁的引入也带来了一定的复杂性和性能开销,特别是在高并发环境下,不合理的锁使用可能导致数据库性能下降甚至出现死锁等问题。

本文将深入探讨MySQL中的各种锁类型及其工作原理,包括共享锁排他锁行级锁表级锁等。我们将从理论和实践两个角度出发,介绍MySQL锁机制的基本概念、常见问题和解决方案,并提供一些优化建议和最佳实践,帮助读者更好地理解和应用MySQL锁,提升数据库系统的性能和可靠性。

目录

前言:

锁:

全局锁:

表级锁:

表锁:

元数据锁:

意向锁:

行级锁:

总结:


锁:

        锁是计算机协调多个进程或者线程并发访问某一资源的机制,在数据库中除了传统的对计算资源的争抢之外,数据也是供许多用户共享的一种资源,如何保证多线程下的数据一致性是数据库必须解决的一个问题

在MySQL中,按照锁的粒度可以分为:

  • 全局锁:锁住数据库中的所有表
  • 表级锁:锁住数据库中的整张表
  • 行级锁:锁住对应的行数据

并不是锁的范围越大越好,当锁的范围越大时候,资源的并发性就越差我们不断的优化MySQL的锁,实际上就是在权衡安全性和效率之间的关系

全局锁:

全局锁就是对整个数据库实例加锁,加锁之后整个实例就处于只读状态,后续DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

典型的使用场景就是做全库的逻辑备份,需要对所有的表进行锁定,从而获取一致性视图,保障数据的完整性。

 逻辑备份:把数据库的数据文件备份成一整个SQL文件。

如何加全局锁:

flush tables with read lock;

 如何解全局锁:

unlock tables;

全局锁的缺点:

如果在主库上备份的时候,那么在备份期间都不能执行更新,业务基本就要停摆。

如果在从库上备份,那么备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。

在InnoDB引擎中,我们可以在备份的时候添加上参数-----single-transaction参数来完成不加锁的一致性数据备份。

表级锁:

 表级锁会在每次操作的时候锁住整张表,锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM,InnoDB,BDB等存储引擎中。

对于表级锁,主要分为以下三类:

  • 表锁
  • 元数据锁
  • 意向锁

表锁:

对于表锁而言,我们又可以分为两类:

  • 表共享锁(read lock)
  • 表独占写锁(write lock)

语法:

1.加锁

lock tables 表名... read/write

2.释放锁

unlock tables 

元数据锁:

元数据锁在加锁的过程中是系统自动控制的,无需显式使用。在访问一张表的时候会自动加上。元数据锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。

在MySQL5.5中,当我们对一张表进行增删改查的时候,加DML读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。

意向锁:

MySQL 中的意向锁(Intention Locks)是一种锁定级别,用于在事务中管理表级锁。它们是为了在使用表级锁时提供更好的性能和并发性而引入的。

意向锁分为两种类型:意向共享锁(Intention Shared Locks)意向排他锁(Intention Exclusive Locks)。它们用于表示事务在特定表上的意向锁定意图。

  • 意向共享锁(IS 锁):当一个事务想要在某个表上获取行级别的共享锁(例如 SELECT 查询时),它会先请求意向共享锁。意向共享锁不会阻止其他事务获取共享锁,但会阻止其他事务获取排他锁。当一个事务持有意向共享锁时,其他事务可以并行地获取共享锁,但不能获取排他锁。

  • 意向排他锁(IX 锁):当一个事务想要在某个表上获取行级别的排他锁(例如 INSERT、UPDATE 或 DELETE 操作时),它会先请求意向排他锁。意向排他锁会阻止其他事务获取任何类型的锁(共享锁或排他锁)。但是,它不会阻止其他事务获取意向共享锁。

意向锁的引入主要是为了提高并发性能。通过引入意向锁,MySQL 可以更有效地管理表级锁,减少了在并发环境下的锁冲突,从而提高了系统的并发处理能力。

在没有意向锁之前,如果一张表里面已经有行锁了,此时我们再添加表锁,为了防止表锁和行锁发生冲突,表锁就需要遍历整个表中的数据检查是否有行锁。为了优化表锁检索行锁的过程,我们引入意向锁。

行级锁:

在 MySQL 中,行级锁是一种锁定级别,用于控制对表中特定行的访问它们允许事务独立地锁定和操作表中的单个行,而不会阻塞其他事务对其他行的访问,从而提高了数据库的并发性能。

MySQL 中的行级锁有两种主要的实现方式:

  1. 共享锁(Shared Locks):也称为读锁(Read Locks),用于读取数据操作。当一个事务获取了某一行的共享锁时,其他事务也可以获取相同行的共享锁,但不能获取排他锁。这意味着多个事务可以并发地读取相同行的数据,但不能进行写操作

  2. 排他锁(Exclusive Locks):也称为写锁(Write Locks),用于修改或删除数据操作。当一个事务获取了某一行的排他锁时,其他事务不能获取相同行的任何类型的锁,包括共享锁和排他锁。这意味着只有一个事务可以修改或删除该行的数据,其他事务必须等待该事务释放锁后才能访问该行。

行级锁在 MySQL 中是基于存储引擎的实现的,不同的存储引擎可能有不同的行级锁实现方式和特性。例如,InnoDB 存储引擎使用了行级锁来实现高度的并发性和事务隔离级别。

InnoDB的数据是基于索引组织的,InnoDB行锁是通过对索引上的索引项来加锁实现的,而不是对记录加锁。

对于InnoDB的行级锁,主要分为以下三类:

1.行锁(Record Lock):锁定单个行记录的锁,防止其他食物对此进行update和delete。在RC,RR隔离级别下都支持。

innoDB为我们提供了两种行锁:

1.共享锁:允许一个事务去读一行,阻止 其他事务获得相同数据集的排他锁。

2.排他锁:允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

SQL行锁类型说明
INSERT排他锁自动加锁
UPDATE排他锁自动加锁
DELETE排他锁自动加锁
SELECT(正常)不加任何锁
SELECT .... LOCK IN SHARE MODE共享锁需要手动在SELECT 之后加上LOCK IN SHARE MODE
SELECT.... FOR  UPDATE排他锁需要手动在SELECT 之后加FOR UPDATE

 默认情况下,InnoDB 在 RR 事务隔离级别运行 ,InnoDB使用next-key 锁进行搜索和索引扫描,以此来防止幻读

InnoDB的行锁是针对索引加的锁,不通过索引条件检索数据的时候,InnoDB就会对表中的所有记录加锁,此时就会升级成为表锁。

2. 间隙锁(Gap Lock):锁定索引记录间隙,确保该索引记录间隙不变,防止其他事务在这个间隙之间进行insert,产生幻读。

间隙锁唯一的目的就是为了防止其他事务插入间隙,间隙锁可以共存。一个事务采用的间隙锁不会阻止另外一个事务在同一间隙上采用间隙锁。

3.临键锁(Next_Key Lock):可以简单理解为行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙GAP。

我们用图来表示一下间隙锁:

间隙锁不包含两边的记录,例如(6,12)这个范围的间隙锁,他不锁6和12的数据。

我们用图来表示一下临建锁:

 在默认情况下,InnoDB在RR的隔离级别下运行,InnoDB使用next-KEY锁进行扫描和索引扫描。以此来防止幻读。

  • 索引上的等值查询(唯一索引),给不存在的记录加锁的时候,会优化成为间隙锁。
  • 索引上的等值查询(普通索引),向右遍历的时候,最后一个至如果不满足查询需求,临键锁就会变为间隙锁。
  • 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止。

总结:

MySQL锁机制是数据库并发控制的重要组成部分,它确保了多个会话(连接)对数据库中数据的读写操作不会相互干扰,从而保证了数据的一致性和完整性。通过引入各种类型的锁,MySQL提供了灵活的并发控制手段,能够满足不同应用场景下的需求。

在本文中,我们深入探讨了MySQL锁的各种类型,包括共享锁、排他锁、行级锁和表级锁等。我们了解了它们的工作原理、应用场景以及优缺点,并探讨了如何在实际应用中合理选择和使用不同类型的锁,以及如何优化锁的性能。

如果我的内容对你有帮助,请点赞,评论,收。创作不易,大家的支持就是我坚持下去的动力!

34bf194e40e44751b7e31decddc018b3.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 热题 100 | 贪心算法

目录 1 121. 买卖股票的最佳时机 2 55. 跳跃游戏 3 45. 跳跃游戏 II 4 763. 划分字母区间 菜鸟做题,语言是 C 1 121. 买卖股票的最佳时机 解题思路: 维护一个变量 max_pricemax_price 用于存储排在 i 天之后的股票最高价格第 i 天的最高利润 …

地质地貌卫星影像集锦(三 矿产资源篇)

1. 元古代沉积岩的抬升 这个地区位于Leigh Creek中部,距离澳大利亚南部的阿德莱德约500km,弗林德斯山脉的北面是Gawler克拉通。弗林德斯山脉是由元古代沉积岩抬升后形成的块体,在其之下的是寒武纪的岩石,它座落在距阿德莱德北…

唐刘:关于产品质量的思考 - 我的基本认知

我在文章《 TiDB in 2023 - 一次简单的回顾 》 中提到了一个我一直以来面临的问题:每次 TiDB 发布新版本后,我如何能够非常自信地告诉客户,这个版本的质量很好,大家可以放心使用呢? 坦白地说, 这个问题并不…

[HackMyVM]靶场Deeper

难度:Easy kali:192.168.56.104 靶机:192.168.56.148 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.148 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-05 19:55 CST Nmap scan report for 192.168.56.148 Host is up (0.00013s latency). N…

数据结构:详解【树和二叉树】

1. 树的概念及结构(了解) 1.1 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝…

智慧公厕升级为多功能城市智慧驿站,助力智慧城市发展

在现代城市的建设中,公共厕所作为基础必备的民生设施,一直是城市管理的重要组成部分。随着科技的不断发展,智慧公厕应运而生,成为了公共厕所信息化、数字化、智慧化的应用解决方案。而近年来,智慧公厕也进行了升级发展…

20240309web前端_第三周作业_教务系统页面

作业&#xff1a;教务系统页面 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

拥塞控制算法系列之:Swift-谷歌2020年SIGCOM-包级别端到端TIMELY拥塞控制算法

核心要点&#xff1a; 谷歌 2020 SIGCOM基于delay的AIMD拥塞拆分EC和FC&#xff0c;时延敏感场景优势分别计算EC和FC的wnd&#xff08;最核心&#xff09;保障吞吐和低延迟。Swift 因利用延迟的简单性和有效性而闻名包级别的论文&#xff1a;https://dl.acm.org/doi/pdf/10.11…

【保姆级讲解如何计算机视觉入门】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

江协STM32:对射式红外传感器计次和旋转编码器计次

对射式红外传感器计次 还是复制粘贴之前的文件 创建外部中断文件 然后写初始化函数 外部中断函数创建 这里写外部中断函数 看着这个图来配置 具体步骤就是&#xff1a; 第一步&#xff0c;配置RCC&#xff0c;把我们这里涉及的外设的时钟都打开&#xff0c;不打开时钟&#…

深入浅出 -- 系统架构之微服务中OpenFeign最佳实践

前面我们讲了一下 Ribbon 和 RestTemplate 实现服务端通信的方法&#xff0c;Ribbon 提供了客户端负载均衡&#xff0c;而 RestTemplate 则对 http 进行封装&#xff0c;简化了发送请求的流程&#xff0c;两者互相配合&#xff0c;构建了服务间的高可用通信。 但在使用后也会发…

c++的学习之路:12、vector(1)

这章主要是根据cplusplus中的文档进行使用Vector&#xff0c;文章末附上测试代码。 目录 一、什么是vector 二、vector的简单使用 三、代码 一、什么是vector 下图是cplusplus的简介&#xff0c;上面一共有六点&#xff0c;如下&#xff1a; 1、vector是表示可变大小数组…

Leetcode 216.组合总和III

题目 思路 题目说只使用数字1-9&#xff0c;是k个数的和 树的宽度是1-9&#xff0c;树的深度是k 1.确定递归函数的返回值及参数&#xff1a; 返回值是void,参数这里还是先设定两个全局变量。一个是path存放符合条件单一结果。如&#xff1a;&#xff08;1&#xff0c;2&…

VSCODE EIDE使用debug记录

用上vscode之后就感觉之前的keil不太爽了&#xff0c;找什么东西搜索都很麻烦&#xff0c;之前有写过eide的文章&#xff0c;想着能不能在eide里面就把debug也做了&#xff0c;发现真的可以&#xff0c;下面记录一下&#xff0c;主要是参考这个大佬的文章&#xff0c;非常感谢。…

微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元&#xff0c;用户现场的分布式发电可以支持用电需求。为此&#xff0c;您的微电网将接入、监控、预测和控制您本地的分布式能源系统&#xff0c;同时强化供电系统的弹性&#xff0c;保障您的用电更经济。您可以在连接…

离线数仓(十)【ADS 层开发】

前言 剩下的 ADS 层主要就是写 SQL 了&#xff0c;就像我们之前练习的 HQL 题一样&#xff0c;不同的是这里的数据从哪张表读取&#xff08;DWD 还是 ADS 甚至个别表需要从 DIM 层读取&#xff09;需要我们自己来分析。 ADS 的建表语句和 MySQL 是对应的&#xff0c;我们到时候…

网络协议——HTTP协议

目录 ​编辑 一&#xff0c;HTTP协议基本认识 二&#xff0c;认识URL 三&#xff0c;http协议的格式 1&#xff0c;发送格式 2&#xff0c;回应格式 四&#xff0c;服务端代码 五&#xff0c;http报文细节 1&#xff0c;Post与Get方法 2&#xff0c;Content_lenth 3&…

OpenCV-python安装教程

先安装opencv-contrib-python pip install opencv-contrib-python 再换源安装opencv-python pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 如果出现 使用这个&#xff0c;3.6环境下不能安装opencv的最新版本 pip install opencv-python4.5.5.62…

ST表(Segment Tree)

目录 1.概述 2.引入 3.ST表对引入的优化 1.概述 ST表是一种基于树形结构的数据结构&#xff0c;用于处理区间查询和更新操作。它通过预处理的方式将原始数据存储在树状结构中&#xff0c;以支持高效的区间查询。ST表的构建时间复杂度为O(nlogn)&#xff0c;其中n为原始数据…

算法——分治(快速排序)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享分治算法关于快速排序的专题 对于快速排序在我个人主页专栏 <排序> 有详细的介绍,此专题对快排进行了优化操作,并介绍了优化后的快排的几种运用 如果有不足的或者错误的请…