MySQL进阶篇之锁(lock)

news2024/11/26 0:24:07

05、锁

5.1、概述

1、介绍

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

2、分类

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

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

5.2、全局锁

1、介绍

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

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

在这里插入图片描述

性能较差,数据逻辑备份时使用。

2、演示:

在这里插入图片描述

3、语法:

  • 加全局锁

    flush tables with read lock;
    
  • 备份数据

    mysqldump -uroot -p密码 数据库名称 >文件名称.sql
    

    如:

    mysqldump -uroot -p1234 db1 >db1.sql
    
  • 关闭全局锁

    unlock tables;
    

4、一致性数据备份

在这里插入图片描述

5、特点

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

  • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

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

mysqldump --single-transaction -uroot -p1234 db1 >db1.sql

5.3、表级锁

5.3.1、介绍

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

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

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

3、语法:

  • 加锁

    lock tables 表名... read/write;
    
  • 释放锁

    unlock tables;
    

    或者客户端断开连接

5.3.2、表锁

1、对于表锁,分为两类:

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

2、演示:

  • 表共享读锁(read lock)

    在这里插入图片描述

    演示:

    在这里插入图片描述

  • 表独占写锁(write lock)

    在这里插入图片描述

    演示:

    在这里插入图片描述

3、注意:

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

5.3.3、元数据锁

1、介绍

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

MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML和DDL冲突,保证读写的正确性。

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

对应SQL锁类型说明
lock tables xxx read/writeSHARED_READ_ONLY/SHARED_NO_READ_WRITE
select、select … lock in share modeSHARED_READ与SHARED_READ、SHARED_WRITE兼容,与EXCLUSIVE互斥
insert、update、delete、select … for updateSHARED_WRITE与SHARED_READ、SHARED_WRITE兼容,与EXCLUSIVE互斥
alter table …EXCLUSIVE与其他的MDL都互斥

3、演示

在这里插入图片描述

4、查看元数据锁

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

在这里插入图片描述

5.3.4、意向锁

1、为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

在这里插入图片描述

2、分类:

  • 意向共享锁(IS):由语句select ... lock in share mode添加。
    • 与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。
  • 意向排他锁(IX):由insertupdatedeleteselect ... for update添加。
    • 与表锁共享锁(read)及排他锁(write)都互斥。意向锁之间不会互斥。

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

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

4、演示:

  • 意向共享锁

在这里插入图片描述

  • 意向排他锁

在这里插入图片描述

5.4、行级锁

5.4.1、介绍

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

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

2、对于行级锁,主要分为以下三类:

  • 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此进行updatedelete。在RC(read commit)、RR(repeatable read)隔离级别下都支持。

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

5.4.2、行锁

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

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

在这里插入图片描述

2、行锁

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

3、演示

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

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

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

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

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
  • 演示①

在这里插入图片描述

  • 演示②

在这里插入图片描述

5.4.3、间隙锁&临键锁

1、默认情况下,InnoDBREPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。

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

② 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。

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

注意

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

2、演示

  • 演示①

    在这里插入图片描述

  • 演示②

    在这里插入图片描述

  • 演示③

    在这里插入图片描述

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

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

相关文章

[DiceCTF 2023] rRabin

一点点学习别人的WP,这回看到一个大姥(r3kapig)的帖子,DiceCTF第二名,不过有好多东西一时还理解不了,得慢慢来。题目这个题有3个功能:rsa加密功能,p,q,N未知,e17低加密指数解密,不过…

JAVA的垃圾收集器与内存分配策略【一篇文章直接看懂】

内存动态分配和垃圾收集技术是JAVA和C之间最大的区别之一 垃圾收集(Garbage Collection,GC)只办三件事: 哪些内存需要回收什么时候回收如何回收 对于对象回收的方法 引用计数法: 每处引用时1,引用失效…

软件测试标准流程

软件测试的基本流程大概要经历四个阶段,分别是制定测试计划、测试需求分析、测试用例设计与编写以及测试用例评审。因此软件测试的工作内容,远远没有许多人想象的只是找出bug那么简单。准确的说,从一个项目立项以后,软件测试从业者…

第一章 认识Python

本章目录 一、初识Python 二、Python环境安装 三、Python代码的执行 四、Python集成开发环境 五、Python2.x与Python3.x的区别 六、本章小结 Python代码的编辑和运行方式主要分为两种:交互模式和脚本模式。 在交互模式下, 用户输入Python代码并按…

非常棒的13款3DMax渲染器插件推荐给大家

3Ds Max 可能是具有最多可与其集成的外部渲染引擎的 3D 软件包。 今天我们将看看 13 个最好的 3Ds max 渲染插件,我们将从以下列表开始: 13- Radeon ProRender ProRender 的正式名称为 FireRender,是 AMD 的开源路径追踪器。这个 3ds Max …

Redis的缓存雪崩、击穿、穿透和解决方案

2.5 缓存穿透问题的解决思路 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种: 缓存空对象 优点:实现简单,维护…

程序员不得不知道的 API 接口常识

说实话,我非常希望自己能早点看到本篇文章,大学那个时候懵懵懂懂,跟着网上的免费教程做了一个购物商城就屁颠屁颠往简历上写。 至今我仍清晰地记得,那个电商教程是怎么定义接口的: 管它是增加、修改、删除、带参查询…

CentOS7.6 zabix5.0-0 —agent2监控Mysql数据库(linux)

Mysql数据库安装步骤链接:https://bbs.huaweicloud.com/blogs/245624 (已安装数据库此步骤可省略~!!) 至少需要两台虚拟机进行试验 一台服务端(监控端)jk 一台客户端(被监控端&…

【(C语言)数据结构奋斗100天】二叉树(上)

【(C语言)数据结构奋斗100天】二叉树(上) 🏠个人主页:泡泡牛奶 🌵系列专栏:数据结构奋斗100天 本期所介绍的是二叉树,那么什么是二叉树呢?在知道答案之前,请大家思考一下…

Window 10 OpenCV 打开罗技(Logitech)摄像头速度慢问题解决

采用最新版OpenCV 4.7.0 摄像头对罗技摄像头进行视频图像抓取时,发现存在打开摄像头问题。 测试环境如下: 系统Windows 10 专业版CPUIntel i7-7700K 4.20GHz 摄像头型号罗技Logitech C930c 网络摄像头OpenCV版本4.7.0语言C 测试结果表明: …

ASP.NET Core+Element+SQL Server开发校园图书管理系统(完)

随着技术的进步,跨平台开发已经成为了标配,在此大背景下,ASP.NET Core也应运而生。本文主要基于ASP.NET CoreElementSql Server开发一个校园图书管理系统为例,简述基于MVC三层架构开发的常见知识点,本系列共五篇文章&a…

抖yin获客系统简介,精准获取,系统简介

功能介绍功能获取获客系统主要核心数据看板名词介绍当前运行任务:系统正在运行的获客任务总数,获取客户档案:符合任务规则提取的目标客户,总分析任务:系统合计运行的获客任务,总视频数:符合任务…

QuickBuck:一款专为安全研究人员设计的勒索软件模拟器

关于QuickBuck QuickBuck是一款基于Golang开发的勒索软件模拟工具,在该工具的帮助下,广大研究人员可以通过更简单的方法来判断反病毒保护方案是否能够有效地预防勒索软件的攻击。 功能介绍 该工具能够模拟下列勒索软件典型行为,其中包括&a…

洛谷——P1091 合唱队形

【题目描述】 n 位同学站成一排,音乐老师要请其中的 n−k 位同学出列,使得剩下的 k 位同学排成合唱队形。 合唱队形是指这样的一种队形:设 kk 位同学从左到右依次编号为 1,2, … ,k,他们的身高分别为​,​, … ,​,则…

m序列发生器——Verilog设计

引言 本篇文章利用Verilog编写一个m序列发生器模块。本文会给出具体的设计、测试源码。 设计说明 模块功能说明: 支持任意位宽的随机数生成;支持本原多项式配置;支持初始种子配置;设计环境: 设计语言:Verilog HDL 设计验证平台:MATLAB R20222a、Vivado 2018.3 m 序列…

初识shell

文章目录一、shell基本知识1.1为什么学习和使用Shell编程1.2 什么是Shell1.2.1 shell的起源1.2.2 shell的功能1.3 shell的分类1.4 作为程序设计的语言——shell1.5 如何学好shell1.6 shell脚本的基本元素1.7 shell脚本编写规范1.8shell脚本的执行方式1.9 执行脚本的方法1.10 sh…

PPOJ刷题-3

PPOJ刷题-3 1265: 最近公共祖先 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&…

Elasticsearch7.8.0版本进阶——分布式集群(单节点集群)

目录一、Elasticsearch集群的安装1.1、Elasticsearch集群的安装(win10环境)1.2、Elasticsearch集群的安装(linux环境)二、单节点集群(win10环境集群演示)2.1、单节点集群的概述2.2、单节点集群的示例一、El…

On Joint Learning for Solving Placement and Routing in Chip Design

On Joint Learning for Solving Placement and Routing in Chip Design 目录On Joint Learning for Solving Placement and Routing in Chip Design一、整体思路和创新点二、相关工作2.1 partitioning-based methods(基于分区的方法)2.2 stochastic/hill…

Part 4 描述性统计分析(占比 10%)——中

文章目录【后续会持续更新CDA Level I&II备考相关内容,敬请期待】【考试大纲】【考试内容】【备考资料】【扩展知识——大数定律和中心极限定理】3、统计分布3.1、离散型随机变量的三种重要分布3.1.1、两点分布3.1.2、伯努利试验及二项分布3.1.2.1、伯努利试验3…