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

MySQL学习(19):锁

1.什么是锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。

在数据库中,数据是供许多用户共享的资源,数据库必须保证数据并发访问的一致性、有效性,这就要靠锁来协调实现。

MySOL中的锁,分为以下三类:

(1)全局锁:锁定数据库中的所有表

(2)表级锁:每次操作锁住整张表

(3)行级锁:每次操作锁住对应的行数据

2.全局锁

2.1全局锁的作用

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态(DML、DDL不可执行,DQL可执行)已经更新操作的事务提交语句都将被阻塞。

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

数据库的备份是逐表进行的,可能刚刚完成了A表的备份,与A表相关的B表又更新了数据,造成了数据的不一致,因此备份前要加上全局锁

2.2实例备份

2.2.1使用全局锁的方法

(1)先进入数据库,通过以下命令创建全局锁:

flush tables with read lock;

(2)创建全局锁后,退出数据库,在windows或linux的命令行界面使用以下命令进行备份:

mysqldump -u登录数据库的用户 -p密码 数据库名>文件名
#-u与-p和后面的内容之间是没有空格的
#命令中的文件名,指的就是数据被复制后,存储到了这个文件里
#如果操作的不是本地数据库,而是远程连接的,那么就需要在命令里加上 -h 远程数据库ip

(3)备份完成后,再进入数据库,输入以下命令解开全局锁:

unlock tables;

2.2.2不使用全局锁的方法

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

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

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

因此实际生产中要慎用全局锁。

在InnoDB引擎环境下,还有一种不使用全局锁实现一致性备份数据库的方法,只需在mysqldump命令里添加一个参数即可:

mysqldump --single-transaction -u登录数据库的用户 -p密码 数据库名>文件名
#注意--single-transaction没有空格

3.表级锁

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

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

(1)表锁

(2)元数据锁(meta data lock,MDL)

(3)意向锁

3.1表锁

表锁分为两类:

(1)表共享读锁,简称读锁

(2)表独占写锁,简称写锁

执行锁操作的会话其他会话
读锁只可读(只能DQL,不能DML、DDL)只可读(只能DQL,不能DML、DDL)
写锁可读可写(DQL、DML、DDL都可以)不可读不可写(DQL、DML、DDL都不可以)

语法:

lock tables 表名 read或write;
#加锁
unlock tables;
#解锁,这条命令会解锁当前会话下的所有表锁

表锁是以会话为分界的,而不是以客户端为分界的,也不是以mysql用户为分界的。也就是说,在当前会话加了写锁,其他会话就无法读写(哪怕是同一客户端同一mysql用户)

3.2元数据锁

*元数据锁(MDL)是系统自动添加的,无需手动使用

*元数据锁是用来防止DML与DDL起冲突的

要明白元数据锁的作用,需要先回顾一下事务的4个隔离级别,其中mysql默认隔离级别Repeatable Read正是靠元数据锁来实现的

元数据锁也有共享读锁与独占写锁,二者相互排斥:

(1)当在一个事务中对某个表进行增删改查(DQL、DML)时,系统会自动给这个表加上共享读锁。其他事务可以对这个表进行增删改查,但不能修改表结构(DDL)

(2)当在一个事务中对某个表进行了修改表结构,即DDL操作(alter table ...),那么系统就会自动给这个表加上独占写锁,其他事务既不可对该表进行增删改查(DQL、DML),也不可修改表结构(DDL)

事务提交后,元数据锁会自动解开

3.3意向锁

对表进行DML操作时,系统会暂时给被操作的数据行加上行锁,如果这时还要给该表加上表锁,就会造成行锁与表锁的冲突(即DML自动添加的行锁与表锁的冲突),为了解决这个冲突的问题,就需要使用意向锁。

简单来说,意向锁是在进行DML操作时与行锁一起添加的,有了意向锁后,再要添加表锁,系统就会先判断表锁与所添加的意向锁是否兼容,如果兼容则可以加表锁,否则就不可。

意向锁有2种:

(1)意向共享锁(IS)

可由以下语句添加:

select... lock in share mode

IS与读锁(read)兼容,与写锁(write)互斥,也就是说,添加了IS后,可以对表加读锁,但不能加写锁

(2)意向排他锁(IX)

insert语句、update语句、delete语句会自动添加意向排他锁,select语句可由以下语句添加:

select...for update

IX与读锁、写锁都互斥

3.4三种表级锁总结

是否是系统自动添加对表的作用一句话总结有啥用
元数据锁我对这张表进行增删改时,你也可以进行增删改,但你不能更改表结构(DDL)解决DDL与DML的冲突
表锁读锁(read)

我不能对表增删改(DML),只能查(DQL)

你也一样。

就锁表用的,你用你就加,不用就不加

写锁

(write)

我可以对表增删改

你都不可以

意向锁意向共享锁(IS)表可以加read,不能加write解决DML自动添加的行锁与表锁的冲突
意向排他锁(IX)执行增删改时是自动,执行时需手动添加表read、write都不能加

4.行级锁

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

*应用在InnoDB存储引擎中。

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

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

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

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

(3)临键锁(Next-key Lock):行锁+间隙锁。在RR事务隔离级别下支持。

4.1行锁

4.1.1共享锁与排他锁

InnoDB实现了以下2种行锁

(1)共享锁(S):其他事务可以和当前事务一起读一行带有S的数据。共享锁之间可兼容,但与排他锁互斥。

(2)排他锁(X):若某行数据被加上了排他锁,那么就只有当前事务能操作它,其他事务不能删改,也不能查。排他锁之间也是互斥的

4.1.2加锁以及查看锁

可以看到行锁的加锁情况与意向共享锁相同,也就说明二者会同时添加

不要忘了意向共享锁是为了解决行锁与表锁的冲突才设置的,因此二者才会同时添加 

*通过下图语句可以查看系统内的锁,其中IS是意向共享锁,

S,REC_NOT_GAP是共享锁,S,GAP是间隙锁,S是临键锁

4.1.3行锁自动升级为表锁的情况

InnoDB行锁是针对索引的锁,如果对没有索引的字段加行锁,那么行锁就会自动升级为表锁

比如在事务A中修改a字段的数据(update),同时a字段没有索引,那么由于update操作自动给这行数据添加了排他锁,同时由于a字段没有索引,这个排他锁自动升级为表锁,这个表的每一行数据就都要收到排他锁的限制,事务B不能对这个表进行增删改查

4.2间隙锁与临键锁

RR隔离级别下不同索引在不同查询情况下的加锁类型:

非唯一索引范围查询临键锁
等值查询查询的值存在临键锁+间隙锁
查询的值不存在间隙锁
唯一索引范围查询行锁+间隙锁
等值查询查询的值存在行锁
查询的值不存在间隙锁

具体加锁过程可见如下连接:

间隙锁详解icon-default.png?t=N7T8https://blog.csdn.net/w15558056319/article/details/122861509?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172309730016800182785516%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=172309730016800182785516&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-23-122861509-null-null.142^v100^pc_search_result_base5&utm_term=%E9%97%B4%E9%9A%99%E9%94%81&spm=1018.2226.3001.4187

相关文章:

MySQL学习(19):锁

1.什么是锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,数据是供许多用户共享的资源,数据库必须保证数据并发访问的一致性、有效性,这就要靠锁来协调实现。 MySOL中的锁,分为以下三类: &am…...

【出海日记】关于 KD ,数据工具的陷阱

一个关键词:deepwoken builder 对标的竞品:deepwoken.co 初步分析: https://ahrefs.com/keyword-difficulty/?countryus 显示这个关键词优化难度极低 拿流量的是一个内页,单靠这个内页一个月有 22 万的流量 看起来很香&#x…...

【k8s集群部署篇】在openEuler环境下部署多master高可用kubernetes集群详细教程(V1.30版本)

【k8s集群部署篇】在openEuler环境下部署多master高可用kubernetes集群详细教程(V1.30版本) 一、相关名词介绍1.1 k8s简介1.2 Keepalived简介1.3 HAProxy简介二、本次实践介绍2.1 环境规划介绍2.2 本次实践简介三、所有节点基础环境配置3.1 主机配置工作3.2 关闭防火墙和seli…...

数据结构:链表经典算法OJ题

目录 前言 一、移除链表元素 二、反转链表 三、合并两个有序链表 四、链表的中间节点 五、环形链表的约瑟夫问题 前言 在了解了链表的相关知识后,我们还需要一些题目进行练习加深对链表这方面知识的理解,也可以用来检测链表这块学的的怎么样&#…...

【线性代数】【二】2.2 极大线性无关组与向量空间的基

文章目录 前言一、极大线性无关组二、向量空间的基三、向量维数与向量空间维数总结 前言 上一篇中我们介绍了向量空间的概念,并且学习了对任意给出的一组向量,如果构造一个向量空间。本文将更加细致的去分析张成一个向量空间,具有哪些性质。…...

OD C卷 - CPU算力分配

CPU算力分配 两组服务器A、B, 每组有多个算力不同的CPU;为了让两组服务器的算力和相等,允许两组各选出一个CPU进行一次交换;求两组中用于交换的CPU算力,从A中选出的算力尽可能小; 输入描述: 第一行 输入L…...

matlab实现红绿灯识别

在MATLAB中实现红绿灯识别通常涉及图像处理技术,包括颜色分割、形态学操作、边缘检测等步骤。下面我将给出一个基本的框架和示例代码,用于在MATLAB中识别图像中的红绿灯。 步骤 1: 读取图像 首先,你需要有一张包含红绿灯的图像。 img imr…...

base64 转 pdf

工作中经常会遇到一些签名的pdf传输,一般都是base64编码,这样就需要我们手动转为pdf, 其实根本不需要自己使用pdf的库写入,只是数据的简单写入就行 package mainimport ("encoding/base64""fmt""os&quo…...

vue2项目微信小程序的tabs切换效果

在 Vue 2 项目中实现类似微信小程序的 tabs 切换效果&#xff0c;可以通过 Vue 的 router-view 和 <router-link> 来完成。这里我们使用 Vue Router 来创建一个标签页切换的效果。 步骤 1: 安装 Vue Router 如果还没有安装 Vue Router&#xff0c;首先需要安装它&#…...

WPF动画的使用

前言 弹幕是什么&#xff1f;这里是使用动画将控件弹起来&#xff0c;通过C#提供的多样化动画类型&#xff0c;我们可以制做出丰富的界面效果。主要有基于时间的动画和基于属性的动画。 1、Animatable 一个提供动画支持的抽象类。 继承 Object DispatcherObject Depende…...

跑腿代购app系统源码开发及功能分析

随着互联网技术的飞速发展和人们生活节奏的加快&#xff0c;跑腿代购服务作为一种便捷的生活方式&#xff0c;正逐渐渗透到我们日常生活的方方面面。从日常购物、餐饮外卖到文件传递、药品代购&#xff0c;跑腿服务以其高效、灵活的特点赢得了广大用户的青睐。而支撑这一服务高…...

mysql数据库:字符串函数

mysql数据库&#xff1a;字符串函数 mysql数据库&#xff1a;字符串函数 concat(str1,str2,…strn) 连接str1&#xff0c;str2&#xff0c;…&#xff0c;strn为一个字符串 select concat(abc,def)replace(str,a,b) 用字符串b替换str中所有出现的字符串a insert(str,x,y,instr…...

C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏&#xff0c;在曾经没有智能电脑和手机的年代&#xff0c;也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~ 一、游戏2048的思路 2048游戏的玩法是在初始的时候&#xff0c;给玩家一个4*4格子的&#xff0c;其中内容全为空的棋盘…...

MATLAB代码检查工具PolySpace

概述 PolySpace是MATLAB里面代码静态检查工具。通过检查源代码&#xff0c;可以确定可能在哪里发生潜在的运行时错误&#xff0c;例如算术溢出&#xff0c;缓冲区溢出等等。它最大的特点是可以检查车企常用的MISRA C标准&#xff0c;还免费&#xff0c;就让各大车企爱不释手。…...

FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕代码)

1、什么是FIFO? FIFO(First In First Out) 是一种先进先出的数据缓存器,在逻辑设计里面用的非常多。它是一种存储器结构,被广泛应用于芯片设计中。FIFO由存储单元队列或阵列构成,第一个被写入队列的数据也是第一个从队列中读出的数据。 FIFO 设计可以说是逻辑设计人员必须…...

快速掌握Vue:基础命令详解

1. Vue概述 Vue.js&#xff08;读音 /vjuː/, 类似于 「view」&#xff09; 是一套构建用户界面的 「渐进式框架」。与其他重量级框架不同的是&#xff0c;Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层&#xff0c;并且非常容易学习&#xff0c;非常容易与其它库…...

MySQL——索引(二)创建索引(1)创建表的时候创建索引

要想使用索引提高数据表的访问速度&#xff0c;首先要创建一个常引。创建索引的方式有三种&#xff0c;具体如下。 创建表的时候可以直接创建索引&#xff0c;这种方式最简单、方便&#xff0c;其基本的语法格式如下所示: CREATE TABLE 表名 (字段名 数据类型 [完整性约束条件…...

源代码加密怎么做?企业常用十款源代码加密软件排行榜

在数字化信息时代&#xff0c;源代码是企业的核心资产之一。保护源代码的安全不仅能防止知识产权泄露&#xff0c;还能保护企业的竞争优势。因此&#xff0c;源代码加密成为企业信息安全的重要环节。 源代码是软件的基础&#xff0c;包含了企业独特的技术和解决方案。未加密的源…...

python 文件打开、读、关闭练习

一、题目要求 二、代码实现 f open("D:\\workspace\\word.txt" , "r", encoding "UTF-8")# 方案一 # content f.read() # count content.count("itheima") # print(f"itmeiha在文件中出现了&#xff1a;{count}次")# 方案…...

迈向大规模小目标检测:综述与数据集

为了准确检测小目标&#xff0c;领域内现有方法大多基于通用目标检测范式进行针对性改进&#xff0c;根据这些改进所采用关键技术的不同&#xff0c;可以分为六种类别&#xff1a;&#xff08;1&#xff09;面向样本的方法&#xff1b;&#xff08;2&#xff09;基于尺度感知的…...

XML Group端口详解

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

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...