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

MySQL进阶知识:锁

目录

前言

全局锁

表级锁

表锁

元数据锁(MDL)

意向锁

行级锁

行锁

行锁演示

间隙锁/临界锁

演示


前言

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

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

全局锁

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

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

具体语句为

-- 添加全局锁
flush tables with read lock;
-- 开始备份
mysqldump -r用户名 -p密码 数据库名>保存文件名称.sql
-- 解锁
unlock tables;

全局锁特点

  • 如果没有做主从分离,那么在备份期间不能执行更新操作,业务基本停摆。
  • 做了主从分离后可以选择在从库上备份,在备份期间从库不能执行主库同步过来的二进制日志(binlog),导致主从延迟。

但也存在不阻塞而是基于快照就可以实现备份的语句

mysqldump --single-transaction -u用户名 -p密码 数据库名>保存的文件名称.sql

表级锁

每次操作所著整张表,锁定粒度大,发生所冲突的概率最高,并发度最低。

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

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

表锁

对于表锁又可以分为两类

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

基本语法

-- 加锁
lock tables 表名… read/write;
-- 释放锁
unlock tables / 客户端断开连接

读锁特点

  • 自身以及其他客户端的读操作可以正常执行。
  • 自身执行写操作会报错,其他客户端执行写操作会阻塞。

写锁特点

  • 自身既可以读也可以写。
  • 其他客户端不能读也不能写,会直接阻塞。

元数据锁(MDL)

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。主要是为了避免DML与DDL冲突,保证读写的正确性。

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

对应SQL

锁类型

select

SHARED_READ

insert、update、delete

SHARED_WRITE

alter table

EXCLUSIVE

共享读与共享写都属于共享锁,他们两个互相兼容并于排他锁互斥。

查看数据库中元数据锁信息

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;

意向锁

意向锁是为了避免DML数据库操作语句在执行过程中,出现行锁与表锁的冲突,通过意向锁可以在创建表锁时不需要去检查每行数据是否有行锁,从而减少表锁检查所带来的性能消耗。

没有使用意向锁之前,客户端A给表中加了行锁,客户端B要给表加表锁,过程如下:

首先客户端A开启一个事务,在事务中对表中的数据进行增删改查,在执行增删改时,会对表中的这些数据加一个行锁,这时客户端B想在表中添加一个表锁,客户端B在添加表锁前,先会去检查当前表中每一行数据是否有行锁,如果没有则会去添加表锁。

也就是说,不使用意向锁的话。客户端向表加锁需要遍历整张表,当表数据量很大时,效率很低。

当有了意向锁之后,客户端A给表中加了行锁,客户端B要给表加表锁,过程如下:

首先客户端A开启一个事务,在事务中对表的数据进行增删改查,对数据添加行锁的同时,又会给表添加一个意向锁,这时客户端B想要在表中添加一个表锁,客户端B就会根据客户端A加的意向锁来判断是否可以成功添加表锁,并且不会再逐行检查数据是否有行锁,效率得到大幅度提升。

简单来说,意向锁相当于一个声明,而不是一个真正的锁,根据这个声明,添加表锁时就有了参考依据,因此不需要逐行判断是否可以添加表锁,从而避免了行锁与表锁产生的冲突。

意向锁的分类

  • 意向共享锁(IS):平常的select语句不会自定添加意向共享锁,需要在select后面加上lock in share mode参数,才能为表建立意向共享锁。
  • 意向排它锁(IX):insert、update、delete、select…for update等语句,都会字段添加一个意向排它锁。

意向共享锁可以与表锁中表共享读锁(read)兼容,但是与表锁中的表独占写锁(write)互斥,当表中存在一个意向共享锁时,我们可以为表正常设置一个读锁,但是不能设置为写锁,当为表设置写锁时,就会处于阻塞状态,只有当事务提交后,写锁才能正常执行。

意向排它锁既与表共享读锁排斥又与表独占写锁排斥,当表中有意向排它锁时,即不可以设置表读锁,也不可以设置为表写锁。

当事务提交后,意向共享锁、意向排它锁都自己释放锁(说是释放,其实可以理解为将标记清空),被阻塞的操作此时才能被执行。

行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。

InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在读已提交、可重复读隔离级别下都支持

间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在可重复读隔离级别下都支持

临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在可重复读隔离级别下支持。

行锁

InnoDB实现了以下两种类型的行锁:

  • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

锁兼容情况如下

共享锁

排他锁

共享锁

兼容

互斥

排他锁

互斥

互斥

加锁情况如下

SQL

行锁类型

说明

insert

排他锁

自动加锁

update

排他锁

自动加锁

delete

排他锁

自动加锁

select

不加锁

select……lock in share mode

共享锁

需要手动在select之后添加local in share mode

select ……for update

排他锁

需要手动在select之后加for update

行锁演示

默认情况下,lnnoDB在可重复读事务隔离级别运行,InnoDB使用临键锁进行搜索和索引扫描,以防止幻读。

  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁

查看行锁情况的SQL语句

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks ;

现在存在一个主键为id的user表,username没有创建索引

在一个客户端开启事务,并进行查询。另一个客户端查看行锁数据

此时我们可以看到,MySQL没有对select语句进行加锁。接下来我们手动对select语句加锁

由于行锁中的共享锁是互相兼容的,因此我也可以再另一个客户端进行select语句,此时锁记录表中出现两条锁记录。

当事务提交后,事务涉及到锁也会释放

接下来我们测试update语句

接下来测试对非索引的字段进行条件判断,观察添加的是什么锁

因此我们可以知道,当对没有索引的字段进行条件查询时,行级锁会升级为表锁。

间隙锁/临界锁

默认情况下,InnoDB在可重复读事务隔离级别运行,lnnoDB使用间隙锁锁进行搜索和索引扫描,以防止幻读。

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

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

演示

展示第一种情况,给不存在的记录加锁。

加下来展示第二种情况,我添加了一个age字段,并创建了普通索引

另一个客户端插入对应被锁住的范围时会阻塞,而插入其他范围可以正常执行。

接下来展示第三种情况,对唯一索引的范围查找。

相关文章:

MySQL进阶知识:锁

目录 前言 全局锁 表级锁 表锁 元数据锁(MDL) 意向锁 行级锁 行锁 行锁演示 间隙锁/临界锁 演示 前言 MySQL中的锁,按照锁的粒度分,分为以下三类 全局锁:锁定数据库中的所有表。表级锁:每次操…...

linux下的工具---gdb

一、gdb简介 GDB,是The GNU Project Debugger 的缩写,是 Linux 下功能全面的调试工具。 GDB支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序&am…...

ESP32-Web-Server编程-JS 基础 2

ESP32-Web-Server编程-JS 基础 2 概述 上节介绍了 JS 编程的基础。如前所述,在 HTML 中,可以通过下述 两种方式使用 JS 程序: 直接在 HTML 文件中通过 script 标签中嵌入 JavaScript 代码。通过 src 元素引入外部的 JavaScript 文件。 在…...

Java Web基础教程

Java Web基础教程 1. Servlet基础 1.1 什么是Servlet Servlet是JavaEE中的标准组件之一,专门用于处理客户端的HTTP请求。并且它必须依赖于Servlet容器(Tomcat就是一个标准的Servlet容器)才能运行。因为Servlet实例的创建和销毁都是由容器负…...

BUUCTF john-in-the-middle 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 注意:得到的 flag 请包上 flag{} 提交 密文: 下载附件,解压得到john-in-the-middle.pcap文件。 解题思路: 1、双击文件,打开wireshark。 看到很多http流…...

HashMap的死循环及数据覆盖问题

目录 一,HashMap 线程不安全的原因 二,HashMap 死循环问题 死循环发生的条件 死循环的具体过程 死循环执行步骤1 死循环执行步骤2 死循环执行步骤3 三,HashMap 数据覆盖问题 数据覆盖执行流程1 数据覆盖执行流程2 数据覆盖执行流…...

数据库数据恢复—MongoDB数据库文件拷贝出现错误的数据恢复案例

MongoDB数据库数据恢复环境: 一台Windows Server操作系统的虚拟机,虚拟机上部署有MongoDB数据库。 MongoDB数据库故障&检测: 在未关闭MongoDB服务的情况下,工作人员将MongoDB数据库文件拷贝到其他分区,然后将原数…...

2023年11月个人工作生活总结

本文为 2023 年 11 月工作生活总结。 研发编码 GIS 模仿了一些有名的地图服务商的网站,将离线地图页面做成全屏,对于大屏幕更加好友。再美化一下全区的边界和区内地域的边界。不过主要工作量还是绘制路线,而绘线作为内部工作,还…...

Spark-06:Spark 共享变量

目录 1.广播变量(broadcast variables) 2.累加器(accumulators) 在分布式计算中,当在集群的多个节点上并行运行函数时,默认情况下,每个任务都会获得函数中使用到的变量的一个副本。如果变量很…...

Spring整合web环境

目录 Javaweb三大组件及环境特点 Spring整合web环境的思路及实现 Spring的web开发组件spring-web MVC框架思想及其设计思路 Javaweb三大组件及环境特点 Spring整合web环境的思路及实现 package com.xfy.listener;import com.xfy.config.SpringConfig; import org.springfra…...

分享从零开始学习网络设备配置--任务4.3 使用动态路由RIPng实现网络连通

任务描述 某公司使用IPv6技术搭建企业网络,由于静态路由需要管理员手工配置,在网络拓扑发生变化时,也不会自动生成新的路由,因此采用IPv6动态路由协议RIPng实现网络连通,实现任意两个节点之间的通信,并降低…...

vue2.0+elementui集成file-loader之后图标失效问题

背景 跑vue2elementUI项目时,由于前端这边需要在本地存放xlsx模板文件,供用户下载模板文件,所以需要在webpack构建的时候增加file-loader进行解析xlsx文件打包。 vue版本2.x element-ui 版本 2.13.x 注意 npm i -D file-loader版本号给vue项…...

C# 文件帮助类(FileHelper)

引言 在研究程序反射的时候我们往往需要获取当前运行程序所引用的dll文件,按照传统的方式我们可以维护一个这样的列表,但是这样维护成本实在是太高,而且不利于团队合作开发,在高版本的.net 4.6.2之后官方出了专门的dll帮我们做这个事情Microsoft.Extensions.DependencyMod…...

WordPress 外链跳转插件

WordPress 外链跳转插件是本站开发的一款WordPress插件,能对文中外链添加一层过滤,有效防止追踪,以及提醒用户。 类似于知乎、CSDN打开其他链接的提示。 后台可以设置白名单 学习资料源代码:百度网盘 密码:123...

算法的10大排序

10大排序算法--python 一颗星--选择排序一颗星--冒泡排序一颗星--插入排序两颗星--归并排序(递归-难)三颗星--桶排序三颗星--计数排序四颗星--基数排序四颗星--快速排序,寻找标志位(递归-难)四颗星--又是比较难的希尔排…...

“十道机器学习问题,帮助你了解基础知识和常见算法“

目录 简介: 1. 什么是机器学习?它与传统编程有什么不同之处?2. 请解释监督学习和无监督学习的区别。3. 什么是过拟合和欠拟合?如何解决这些问题?4. 请解释交叉验证在机器学习中的作用。5. 什么是特征选择?为…...

部署WAF安全应用防火墙(openresty部署)

使用NGINX+Openresty实现WAF功能 一、了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列针对HTTP/HTTPS的 安全策略 来专门为Web应用提供保…...

yml转properties工具

目前搜索到的大部分代码都存在以下问题: 复杂结构解析丢失解析后顺序错乱 所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外,还可以生成代码、sql转json等,可…...

zerotier 搭建 moon中转服务器 及 自建planet

搭建moon 服务器 环境准备 # 安装依赖 yum install wget gcc gcc-c git -y yum install json-devel -y# 下载及安装 curl -s https://install.zerotier.com/ | sudo bash节点ID 配置 配置moon.json文件 cd /var/lib/zerotier-one/# 导出依赖 zerotier-idtool initmoon ide…...

深入了解Rabbit加密技术:原理、实现与应用

一、引言 在信息时代,数据安全愈发受到重视,加密技术作为保障信息安全的核心手段,得到了广泛的研究与应用。Rabbit加密技术作为一种新型加密方法,具有较高的安全性和便捷性。本文将对Rabbit加密技术进行深入探讨,分析…...

Linux常用命令——mv命令

文章目录 1. 简介2. 命令格式3. 主要参数4. 常见用法及示例4.1 移动文件4.2 重命名文件4.3 交互式移动文件4.4 强制移动文件4.5 移动多个文件4.6 使用通配符移动文件 5. 注意事项6. 结论 1. 简介 mv 命令在Linux系统中用于移动文件或目录,同时也可以用于重命名文件…...

Panalog 日志审计系统 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统,方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 sy_query.php接口处存在远程命令执行漏洞,攻击者可执行任意命令,接管服务器权限。 0x03 复现环境 FOFA&#xf…...

Android设置文字颜色渐变

项目中用到了很多文字颜色渐变的设计,因此做一下记录。 核心代码如下: /*** 统一文字渐变色设置* param colors 渐变色字符串数组* param positions 渐变色位置数组,可为空* param start 渐变起始点,可为空* param end 渐变结束…...

java基础面试题(二)

java后端面试题大全 3.JVM3.1 对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置?3.2 java类的加载流程3.3 java内存溢出什么时候会发生以及解决方法 3.JVM 3.1 对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置? 堆 对象实例、String常量池、基…...

php爬虫实现把目标页面变成自己的网站页面

最近又被烦的不行,琐事不断,要是比起懒来一个人比一个人懒,但是懒要转换成动力啊,能让自己真正的偷懒,而不是浪费时间。每天还是需要不断的学习的,才能更好的提高效率,把之前做的简单小功能爬虫…...

[c语言c++]手写你自己的swap交换函数

函数传参有按值传递,指针传递,引用传递,分别看一下三种情况下的交换函数如何书写,应该使用哪种最方便。 当书写一个交换两个值的 swap 函数时,我们可以分别使用按值传参、指针传参和引用传参的方式来实现。下面是示例和…...

技术类知识汇总(二)

在自己日常学习javaweb的过程中,做的一些笔记和总结,汇总如下: Springboot项目的静态资源(html,css,js等前端资源)默认存放目录为:classpath:/static classpath:/public classpath:/resources"三层架…...

简单好用!日常写给 ChatGPT 的几个提示词技巧

ChatGPT 很强,但是有时候又显得很蠢,下面是使用 GPT4 的一个实例: 技巧一:三重冒号 """ 引用内容使用三重冒号 """,让 ChatGPT 清晰引用的内容: 技巧二:角色设定…...

pytorch分布式训练

1 基本概念 rank:进程号,在多进程上下文中,我们通常假定rank 0是第一个进程或者主进程,其它进程分别具有1,2,3不同rank号,这样总共具有4个进程 node:物理节点,可以是一个…...

【PyTorch】(三)模型的创建、参数初始化、保存和加载

文章目录 1. 模型的创建1.1. 创建方法1.1.1. 通过使用模型组件1.1.2. 通过继承nn.Module类 1.2. 模型组件1.2.1. 网络层1.2.2. 函数包1.2.3. 容器 1.3. 将模型转移到GPU 2. 模型参数初始化3. 模型的保存与加载3.1. 只保存参数3.2. 保存模型和参数 1. 模型的创建 1.1. 创建方法…...