当前位置: 首页 > news >正文

【MYSQL锁】透彻地理解MYSQL锁

🔥作者主页:小林同学的学习笔录

🔥mysql专栏:小林同学的专栏

目录

1.锁

1.1  概述 

1.2  全局锁

1.2.1  语法

1.2.1.1   加全局锁

1.2.1.2   数据备份

1.2.1.3   释放锁

1.2.1.4   特点

1.2.1.5   演示

1.3   表级锁

1.3.1  介绍

1.3.2  表锁

1.3.2.1  语法

1.3.2.2  特点

1.3.2.3  结论

1.3.3  元数据锁

1.3.4  意向锁

1.3.4.1  介绍

1.3.4.2  分类

1.3.4.3  演示

1.4  行级锁

1.4.1  介绍

1.4.2  行锁

1.4.3  演示

1.4.4  间隙锁&临键锁

1.4.4.1  示例演示

1.锁


1.1  概述 


锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源

(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。

如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据

库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

MySQL中的锁,按照锁的力度分,分为以下三类:

  • 全局锁:锁定数据库中的所有表。
  • 表级锁:每次操作锁住整张表。
  • 行级锁:每次操作锁住对应的行数据。


在介绍锁之前先回顾一下DML、DQL、DDL分别代表什么?


数据操作语言(DML):DML 用于对数据库中的数据执行操作,例如插入、更新、删除、查询数

据,简称增删改查,尽管 SELECT 语句通常被归类为 DQL,但它也可以在某种程度上被认为是

DML,因为它允许检索数据。


数据查询语言(DQL):DQL 用于从数据库中检索数据。它专门用于执行查询操作


数据定义语言(DDL):DDL 用于定义数据库的结构,包括创建、修改和删除数据库对象,

例如(表、索引、视图等)。DDL 的操作影响数据库的整体结构。

1.2  全局锁


全局锁(Global Lock)是数据库管理系统中的一种锁定机制,通常用于锁定整个数据库实例,而

不是单个表或行。全局锁可以阻止对整个数据库的写入操作,但通常不会阻止读取操作。这种锁定

机制在某些情况下可以用于数据库备份、恢复或维护操作。

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

完整性.

为什么全库逻辑备份,就需要加全就锁呢?

①.先来分析一下不加全局锁,可能存在的问题。

假设在数据库中存在这样三张表: tb_stock 库存表,tb_order 订单表,tb_orderlog 订单日志表。

在进行数据备份时,先备份了tb_stock库存表。

然后接下来,在业务系统中,执行了下单操作,扣减库存,生成订单(更新tb_stock表,插入

tb_order表)。

然后再执行备份 tb_order表的逻辑。

业务中执行插入订单日志操作。

最后,又备份了tb_orderlog表。

此时备份出来的数据,是存在问题的。因为备份出来的数据,tb_stock表与tb_order表的数据不一

致(有最新操作的订单信息,但是库存数没减)。

②.再来分析一下加了全局锁后的情况

对数据库进行进行逻辑备份之前,先对整个数据库加上全局锁,一旦加了全局锁之后,其他的

DDL、DML全部都处于阻塞状态,但是可以执行DQL语句,也就是处于只读状态,而数据备份就

是查询操作。那么数据在进行逻辑备份的过程中,数据库中的数据就是不会发生变化的,这样就保

证了数据的一致性和完整性。

1.2.1  语法


1.2.1.1   加全局锁

flush tables with read lock ;

1.2.1.2   数据备份


mysqldump -uroot –p1234 itcast > itcast.sql

mysqldump -uXxx –pXxx 数据库名 > 磁盘地址  +  数据库名.sql

例如:mysqldump -uXxx –pXxx db_01 > D:/db_01

1.2.1.3   释放锁


unlock tables ;

1.2.1.4   特点


数据库中加全局锁,是一个比较重的操作,存在以下问题:

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

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

主从延迟。


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

据备份。

mysqldump --single-transaction -uroot –p123456 itcast > itcast.sql

1.2.1.5   演示

开启两个命令行

第一个命令行


第二个命令行

会处于阻塞状态,光标一直在闪,只有全局锁被释放才可以执行相应的操作

1.3   表级锁


1.3.1  介绍


表级锁,每次操作锁住整张表锁定力度大,发生锁冲突的概率最高,并发度最低。应用在

MyISAM、InnoDB、BDB等存储引擎中。


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

  • 表锁
  • 元数据锁(meta data lock,MDL)
  • 意向锁


1.3.2  表锁


对于表锁,分为两类:

①.表共享读锁(read lock)

②.表独占写锁(write lock)


1.3.2.1  语法


加锁:lock tables 表名... read/write。

释放锁:unlock tables /  客户端断开连接 。


1.3.2.2  特点


①.读锁

左侧为客户端一,对指定表加了读锁,不会影响右侧客户端二的读,但是会阻塞右侧客户端的写。


②.写锁

左侧为客户端一,对指定表加了写锁,会阻塞右侧客户端的读和写。


1.3.2.3  结论


读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞其他客户

端的写。


1.3.3  元数据锁


MDL(meta data lock)加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加

上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进

行写入操作为了避免DML与DDL冲突,保证读写的正确性。

注意:有元数据锁只有在事务开启,才有的锁,当事务提交之后相应的锁会被释放.


这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的

事务时,是不能够修改这张表的表结构的。

在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进

行变更操作的时候,加MDL写锁(排他),另外共享锁是兼容的。


常见的SQL操作时,所添加的元数据锁:


1.3.3.1  演示


①.当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享锁

(SHARED_READ / SHARED_WRITE),之间是兼容的,所以不会出现阻塞状态。


②.当执行SELECT语句时,添加的是元数据共享锁(SHARED_READ),会阻塞元数据排他锁

(EXCLUSIVE),之间是互斥的,所以出现了阻塞状态。

我们可以通过下面的SQL,来查看数据库中的元数据锁的情况:

select object_type,object_schema,object_name,lock_type,lock_duration fromperformance_schema.metadata_locks ;


1.3.4  意向锁


1.3.4.1  介绍


为了避免DML在执行时,加的行锁与表锁的冲突在InnoDB中引入了意向锁,使得表锁不用检查

每行数据是否加行锁,使用意向锁来减少表锁的检查。

假如没有意向锁,客户端一对表加了行锁后,客户端二如何给表加表锁呢?

来通过示意图简单分析一下:

首先客户端一,开启一个事务,然后执行DML操作,在执行DML语句时,会对涉及到的行加锁。

当客户端二,想对这张表加表锁时,会检查当前表是否有对应的行锁,如果没有,则添加表锁,此

时就会从第一行数据,检查到最后一行数据,效率较低。

有了意向锁之后 :

客户端一,在执行DML操作时,会对涉及的行加行锁,同时也会对该表加上意向锁。

而其他客户端,在对这张表加表锁的时候,会根据该表上所加的意向锁来判定是否可以成功加上表

锁,而不用逐行判断行锁情况了。


1.3.4.2  分类


①.意向共享锁(IS): 由语句select ... lock in share mode添加 。 与 表锁共享锁(read)兼容,与表锁

排他锁(write)互斥。

②.意向排他锁(IX): 由insert、update、delete、select...for update添加 。与表锁共享锁(read)及排

他锁(write)都互斥,意向锁之间不会互斥。


一旦事务提交了,意向共享锁、意向排他锁,都会自动释放。


可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data fromperformance_schema.data_locks;


1.3.4.3  演示


①.意向共享锁与表读锁是兼容的

由于select语句不会自动加行锁,需要手动加行锁

select * from score where id = 1 lock in share mode;

②.意向排他锁与表读锁、写锁都是互斥的

insert、update、delete语句会自动加行锁


1.4  行级锁


1.4.1  介绍


行级锁,每次操作锁住对应的行数据。锁定力度最小,发生锁冲突的概率最低,并发度最高。应用

在InnoDB存储引擎中。

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

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

①.行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。

在RC、RR隔离级别下都支持。

②.间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他

事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。

③.临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。

在RR隔离级别下支持。

1.4.2  行锁


共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁.就是允许一个事务

select,另外事务可以获得相同数据的共享锁,但是不能获得相同数据集的排他锁。


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

锁。


两种行锁的兼容情况如下:

常见的SQL语句,在执行时,所加的行锁如下:


1.4.3  演示


①.针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。

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


可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data fromperformance_schema.data_locks;

  • 加共享锁,共享锁与共享锁之间兼容。
  • 共享锁与排他锁之间互斥。

  • 排它锁与排他锁之间互斥

  • 无索引行锁升级为表锁

注意:这里面经常会手动开启事务的原因是为了演示效果,如果是自动开启事务会自动提交事务,

会把锁给释放,因此看不出效果,但是原理还是一样的.

1.4.4  间隙锁&临键锁


默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜

索和索引扫描,以防止幻读

①.索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。


②.索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock

退化为间隙锁。

③.索引上的范围查询(唯一索引)--会访问到不满足条件的第一个值为止。


注意:间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻

止另一个事务在同一间隙上采用间隙锁。


1.4.4.1  示例演示


①.索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁


②.索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock

退化为间隙锁。

介绍分析一下:


我们知道InnoDB的B+树索引,叶子节点是有序的双向链表。 假如,我们要根据这个二级索引查询

值为18的数据,并加上共享锁,我们是只锁定18这一行就可以了吗? 

并不是,因为是非唯一索引,这个结构中可能有多个18的存在,所以在加锁时会继续往后找,找

到一个不满足条件的值(当前案例中也就是29)。此时会对18加临键锁,并对29之前的间隙加锁

这里的临键锁(行锁+间隙锁),还会锁住age=3的行,并且还会锁住主键为1-3之间的间隙


③.索引上的范围查询(唯一索引)--会访问到不满足条件的第一个值为止

所以数据库数据在加锁是,就是将19加了行锁,25的临键锁(包含25及25之前的间隙),正无穷

的临键锁(正无穷及之前的间隙)。

麒麟而非淇淋,不是干货不制作https://blog.csdn.net/2301_77358195

相关文章:

【MYSQL锁】透彻地理解MYSQL锁

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …...

【静态分析】静态分析笔记01 - Introduction

参考: BV1zE411s77Z [南京大学]-[软件分析]课程学习笔记(一)-introduction_南京大学软件分析笔记-CSDN博客 ------------------------------------------------------------------------------------------------------ 1. program language and static analysis…...

使用的sql

根据CODE去重 SELECT * FROM ( SELECT count( camera_code ) AS count, camera_code FROM n_camera_basic GROUP BY camera_code ) t WHERE t.count >1 DELETE FROM n_camera_basic WHERE camera_id NOT IN (SELECT dt.minno…...

【ZZULIOJ】1052: 数列求和4(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 输入n和a,求aaaaaa…aa…a(n个a),如当n3,a2时,222222的结果为246 输入 包含两个整数,n和a,含义如上述,你可以假定n和a都是小于10的非负整…...

【Linux】tcpdump P3 - 过滤和组织返回信息

文章目录 基于TCP标志的过滤器格式化 -X/-A额外的详细选项按协议(udp/tcp)过滤低详细输出 -q时间戳选项 本文继续展示帮助你过滤和组织tcpdump返回信息的功能。 基于TCP标志的过滤器 可以根据各种TCP标志来过滤TCP流量。这里是一个基于tcp-ack标志进行过滤的例子。 # tcpdump…...

vscode免费登录ssh ,linux git配置免密码

1、vscode远程ssh免密 在windows下生成密钥 , cmd窗口下执行 ssh-keygen -t rsa 在C:\Users\xxxx\.ssh目录下生成 在linux下面 cd .ssh 创建authorized_keys 文件, 把之前windows下生成的 id_rsa.pub内容复制进去 2、gitlab 配置。 在linux下面 ssh-keygen -t rs…...

Netty 心跳(heartbeat)——服务源码剖析(上)(四十一)

剖析目的 Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一个服务----心跳机制 heartbeat.通过心跳检査对方是否有效,这是 RPC 框架中是必不可少的功能。下面我们分析一下 Netty 内部心跳服务源码实现。 源…...

C语言—每日选择题—Day65

前言 我们的刷题专栏又又又开始了,本专栏总结了作者做题过程中的好题和易错题。每道题都会有相应解析和配图,一方面可以使作者加深理解,一方面可以给大家提供思路,希望大家多多支持哦~ 第一题 1、如下代码输出的是什么…...

【环境变量】基本概念理解 | 查看环境变量echo | PATH的应用和修改

目录 前言 基本概念&理解 注意的点 查看环境变量的方法 PATH环境变量 PTAH应用系统指令 PTAH应用用户程序 命令行参数的修改(内存级) 配置文件的修改 windows环境变量 大家天天开心🙂 bash进程的流程。环境变量在系统指…...

5.7Python之元组

元组(Tuple)是Python中的一种数据类型,它是一个有序的、不可变的序列。元组使用圆括号 () 来表示,其中的元素可以是任意类型,并且可以包含重复的元素。 与列表(List)不同,元组是不可…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 一、简单介绍 二、简单视频放大抖动效果实现原理 三、简单视频放大…...

如何通过VPN访问内网?

VPN(Virtual Private Network)是一种通过公共网络建立私有网络连接的技术,可以在不同地点的网络中建立安全通道,实现远程访问内网资源的目的。本文将介绍如何通过VPN访问内网,并介绍一款名为“天联”的VPN服务。 什么是…...

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表 文章目录 RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表1. MQTT概览2. MQTT 5.0 特性1. 特性概要2. Docker中安装RabbitMQ及启用MQTT5.0协议 3. MQTT 5.0 功能列表1. 消息过期1. 描述2. 举例3. 实现 2. 订阅标识…...

常用脚本01 - 生成证书

1 生成证书 第一步、准备脚本文件 [rootharbor-01 ssl]# vim gencert.sh #!/usr/bin/env bash set -eDOMAIN"$1" IP"$2" WORK_DIR"$(mktemp -d)"if [ -z "$DOMAIN" ]; thenecho "Domain name needed."exit 1 fiecho "…...

【jQuery】jQuery框架

目录 1.jQuery基本用法 1.1选择器 1.2jQuery对象 1.3事件绑定 1.4链式编程 1.5过滤方法 1.6样式操纵 1.6属性操纵 1.7操作value 1.8查找方法 1.9类名操纵 1.10事件进阶 1.11触发事件 1.12window事件绑定 2.节点操作与动画 2.1获取位置 2.2滚动距离 2.3显示/隐…...

使用OMP复原一维信号(MATLAB)

参考文献 https://github.com/aresmiki/CS-Recovery-Algorithms/tree/master MATLAB代码 %% 含有噪声 % minimize ||x||_1 % subject to: (||Ax-y||_2)^2<eps; % minimize : (||Ax-y||_2)^2lambda*||x||_1 % y传输中可能含噪 yyw % %% clc;clearvars; close all; %% 1.构…...

Linux安装最新版Docker完整教程

参考官网地址&#xff1a;Install Docker Engine on CentOS | Docker Docs 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.6 系统&#xff0c;内核版本为3.10 1.3 安装依赖包 …...

iOS object-c self关键字总结

在Objective-C中&#xff0c;self 关键字是一个指向当前对象的指针。它是对象自身实例的别名&#xff0c;通常在对象内部的方法中使用&#xff0c;以提供一个指向当前对象的引用。使用 self 可以帮助你访问对象的属性和方法&#xff0c;特别是在处理消息传递和方法调用时。 以…...

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…...

hive管理之ctl方式

hive管理之ctl方式 hivehive --service clictl命令行的命令 #清屏 Ctrl L #或者 &#xff01; clear #查看数据仓库中的表 show tabls; #查看数据仓库中的内置函数 show functions;#查看表的结构 desc表名 #查看hdfs上的文件 dfs -ls 目录 #执行操作系统的命令 &#xff01;命令…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...