MySQL全局锁、表级锁、行级锁介绍演示(详细)

news2024/11/20 14:24:08

目录

介绍

分类

1、全局锁

1.1介绍

1.2场景

1.3语法

1.4演示

2、表级锁

2.1介绍

2.2分类

2.3语法

2.4演示

3、行级锁

3.1介绍

3.2分类

3.3场景


介绍

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

分类

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

        1、全局锁:锁定数据库中所有表;

        2、表级锁:每次操作锁住整张表;

        3、行级锁:每次操作锁住对应的行数据;

1、全局锁

1.1介绍

        全局锁就是对整个数据库实例加锁,加锁后整个数据库实例处于只读状态,提交的写入、更新、删除操作语句都会被阻塞。

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

1.2场景

        假如数据库中有三张表,分别是商品库存表、订单表、订单记录表,如果对数据库直接进行备份,当商品库存表备份完成继续执行后续备份时,有客户下单会使三张表数据都进行改变,导致备份的商品库存表是该客户下单前的数据,订单表和订单记录表时该客户下单后的数据,此时备份完成的数据就不完整,不一致。

1.3语法

        实现加全局锁进行逻辑备份主要分为以下步骤:

        1、flush tables with read lock; 加全局锁;

        2、mysqldump -u账户 -p密码 数据库名 > 备份sql文件路径 进行备份;

        3、unlock tables; 释放全局锁;

1.4演示

连接数据库:我使用的本地数据库,如测试远程数据库可使用 mysql -h IP地址 -u 账号 -p 密码 连接;

加全局锁:所有数据库表全部锁住;

测试读写语句:此时数据库处于只读状态,更新、写入、删除语句都被不生效;

备份:因为该命令不是sql命令,所以需要退出mysql直接在命令窗口执行即可;

释放锁:

2、表级锁

2.1介绍

        表级锁,每次操作锁住整张表,锁粒度最大,发生锁冲突的概率最高,并发最低,

2.2分类

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

        1.表锁;对于表锁可以分为两类:

                1.1表共享读锁:加锁后只能读数据,不能更新、写入、删除数据,并且其他客户端访问也只能读数据,不能更新、写入、删除数据;

                1.2表独占写锁:加锁后可以读、更新、写入、删除数据,但其他客户端访问不能读、更新、写入、删除数据;

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

        说明:元数据其实就是表的结构,元数据锁就是用来保证表结构的一致性,比如当某张表上有未提交的事务时,系统会自动加锁,该期间不能改变表的结构。

        在MySQL5.5中引入了元数据锁,当对一张表进行增删改查的时候,自动加MDL读锁,当对表的结构进行变更操作的时候,自动加MDL写锁。

        3.意向锁:为了避免DML语句执行时,加的行锁与表锁冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否有行锁,使用意向锁来减少表锁的检查。意向锁可分为两类:

                3.1意向共享锁(IS):与表锁共享读锁兼容,与表锁独占写锁互斥;

                3.2意向排他锁(IX):与表锁共享读锁和表锁独占写锁都互斥;意向锁之间不会互斥;

        说明:线程A开启事务,执行更新语句更新第五行数据,于是第五行数据会加上行锁,此时线程B进来准备对该表加表锁,线程B加表锁前会检查该表每行数据是否有行锁及类型,于是就会从第一行挨个检查,这个时候检查的效率就会极低。当引入了意向锁之后就会变成这样的情况,线程A开启事务,执行更新语句更新第五行数据,于是第五行数据会加上行锁同时对该表加上意向锁,此时线程B进来准备对该表加表锁,此时检查的是该表是否有意向锁而不是每行检查行锁,发现意向锁之后线程B被阻塞,知道线程A提交事务结束线程B继续执行任务。

2.3语法

表锁        

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

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

2.4演示

表共享读锁:客户端1进行加锁,加锁后客户端1只能读数据,不能操作数据,客户端2只能读数据,操作数据会被阻塞,直到客户端1释放锁,客户端2的操作数据语句才会继续执行;

 表独占写锁:客户端1加锁后,可以进行读写数据操作,客户端2的读写操作都会被阻塞,直到客户端1将锁释放才会继续执行;

元数据库锁:在客户端1开始事务,执行查询语句且不提交事务,然后在客户端2中修改表结构会被阻塞,直到客户端1提交事务后,客户端2的修改表结构语句才会继续执行。

意向共享锁:select语句需手动加上 lock in share mode 才会加上行锁和意向共享锁;

意向排他锁:update、delete、insert语句执行时会自动加行锁和意向排他锁;

3、行级锁

3.1介绍

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

3.2分类

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

        1.行锁:锁定单个行记录的锁,防止其他事务对此进行update和delete,在RC、RR隔离级别下都支持;行锁分为以下两类:

                1.1共享锁(S):允许一个事务去读一行,阻止其他事务获取相同数据的排他锁(共享锁与共享锁兼容,共享锁与排他锁互斥);

                1.2排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获取相同数据的共享锁和排它锁(排他锁与共享锁互斥,排他锁与排他锁互斥);

        2.间隙锁:锁定索引记录间隙,不包含记录,确保索引记录间隙不变,防止其他事务在这个间隙进行insert,在RR隔离级别下支持;

        3.临键锁:行锁和间隙锁的组合,同时锁住数据和数据前面的所有间隙,在RR隔离级别下支持;

3.3场景

行锁

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

SQL行锁类型说明
INSERT...排他锁自动加锁
UPDATE...排他锁自动加锁
DELETE...排他锁自动加锁
SELECT...不加任何锁
SELECT... LOCK IN SHAR MODE共享锁需手动在SELECT后加LOCK IN SHAR MODE
SELECT... FOR UPDATE排他锁需手动在SELECT后加FOR UPDATE

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

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

相关文章

linux下搭建Hbase分布式数据库

文章目录Hbase概念1.安装Hbase1.jdk的配置2.安装hbase2.启动和操作1.启动服务2 **web-ui访问地址:http://node01:16010/master-status**3.简单的操作1.连接 HBase2.帮助命令3.创建一张表 create a table4.使用查看表是否存在5.describe 查看表描述6.put命令插入数据到表7. scan…

jmeter插件的安装

前言 jmeter常用的插件有很多,本身安装的jmeter是没有安装插件的工具,需要下载一个jar包,通过插件安装工具去安装jmeter插件plugins-manager.jar这个jar包就是用来安装jmeter插件的jar把这个jar包下载后放到jmeter的lib/ext目录下重启jmeter…

C++语法(16)---- 多态

https://blog.csdn.net/m0_63488627/article/details/130106690?spm1001.2014.3001.5501https://blog.csdn.net/m0_63488627/article/details/130106690?spm1001.2014.3001.5501 目录 1. 多态的概念 2.多态的实现 1.虚函数 2.多态条件 得到的多态条件 特殊条件 3.虚函…

Socks5代理和IP代理

Socks5代理和IP代理是常用的网络代理服务,它们为用户提供了匿名访问和保护隐私的功能。在本文中,我们将介绍这两种代理的基本概念和工作原理,并展示如何编写一个简单的代理服务器。 一、什么是Socks5代理和IP代理? Socks5代理…

[操作系统安全]SetUID与Capability权能

问题一、解释“passwd”, “sudo” , “ping”等命令为什么需要 setuid位,去掉s位试运行,添加权能试运行。 1、为什么需要setuid位: 首先明确setuid的作用是:执行该设置后,文件执行时将以文件拥有者的身份执行&#xf…

C++【栈队列(3种)反向迭代器】

文章目录一、容器适配器二、栈(一)栈定义(二)栈使用接口(三)栈模拟实现(1) 栈模拟实现解析(2) 栈模拟实现代码(3) 栈模拟结果三、队列(一)普通队列(1)普通队列…

4、浅谈Makefile文件及其简单的使用知识

文章目录1、什么是Makefile?(1)makefile关系到了整个工程的编译规则。(2)makefile带来的好处就是——“自动化编译”(3)make是一个命令工具,是一个解释makefile中指令的命令工具2、为…

[FREERTOS]队列

1.什么是队列 队列也称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务之间,中断和任务之间传递信息 2.传递信息为什么不用全局变量呢? 确实全局变量依然可以传递信息,但是如果全局变量改变的很频繁&#x…

网工必知—什么是堡垒机?-CCIE

什么是堡垒机? 网络工程师一定听过或用过所谓的“堡垒机”,那么堡垒机到底是什么呢? 堡垒机是一种跳板机制(Jump Server),在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的…

flink 1.16 在centos安装 部署踩的坑

报错: 1 RESOURCES_DOWNLOAD_DIR : 这个错误是修改了 conf目录下 的 master 或 workers 等信息造成的. 2 修改了这个信息可能会造成输入密码的问题. 3 Could not connect to BlobServer at address localhost/127.0.0.1:39203 这个端口还会变化,这种问题可能是因为conf下的…

Python将Word文件中的内容写入Excel文件

在日常办公中我们经常需要将word文件中的数据写入Excel中,如果是手动一个一个进行复制粘贴,那将会非常的耗时且繁琐! 遇到这种问题我们首先想到就是利用编程解决,今天我分享一个word转excel的小方法! 首先我有一个wo…

常见漏洞扫描工具AWVS、AppScan、Nessus的使用

HVV笔记——常见漏洞扫描工具AWVS、AppScan、Nessus的使用1 AWVS1.1 安装部署1.2 激活1.3 登录1.4 扫描web应用程序1.4.1 需要账户密码登录的扫描1.4.2 利用录制登录序列脚本扫描1.4.3 利用定制cookie扫描1.5 扫描报告分析1.5.1 AWVS报告类型1.5.2 最常用的报告类型&#xff1a…

Microchip的10M以太网解决方案

(以下所有图片均来源于Microchip官网) 一 为什么需要10M车载以太网 目前车载百兆以太网(100Base-T1)和千兆以太网(1000Base-T1)技术较为成熟,但如果直接用100Base-T1/1000Base-T1来替代目前被广…

anaconda 创建虚拟环境 基本命令操作

下载好之后直接打开 anaconda prpmpt : 此时直接输入 :activate 不加环境名是直接进入到base环境中的 必须先进入到base环境中再使用后边的命令 : activate 直接进入base环境:如图:conda create -n 名字 python3.7 创建虚拟…

善用Embedding,我们来给文本分分类

你好,我是徐文浩。 上一讲里我们看到大模型的确有效。在进行情感分析的时候,我们通过OpenAI的API拿到的Embedding,比T5-base这样单机可以运行的小模型,效果还是好很多的。 不过,我们之前选用的问题的确有点太简单了。…

springboot服务端接口外网远程调试,并实现HTTP服务监听 - 内网穿透

文章目录前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统2.2 创建隧道映射本地端口2.3 测试公网地址3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址4. …

segment anything paper笔记

demo主页(包含paper, demo, dataset) 通过demo可以看到一个酷炫的效果,鼠标放在任何物体上都能实时分割出来。 segment anything宣传的是一个类似BERT的基础类模型,可以在下游任务中不需要再训练,直接用的效果。 而且…

增强领域的知识图谱

以下是一些近两年基于知识图谱做知识增强的顶会论文: "knowledge-enhanced hierarchical graph convolutional networks for intent detection" (acl 2021) "kg-bert: bert for knowledge graph completion" (emnlp 2019) "k-adapter: i…

C语言刷题--内存存储、操作符

魔王的介绍:😶‍🌫️一名双非本科大一小白。魔王的目标:🤯努力赶上周围卷王的脚步。魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍&#x1…

04-Mysql常用操作

1. DDL 常见数据库操作 # 查询所有数据库 show databases; # 查询当前数据库 select databases();# 使用数据库 use 数据库名;# 创建数据库 create database [if not exits] 数据库名; # []代表可选可不选# 删除数据库 drop database [if exits] 数据库名; 常见表操作 创建…