MySQL 锁分类和详细介绍

news2024/11/25 22:52:16

锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源,锁机制是保证数据一致性和并发性的重要手段,它的地位非常重要。

基本分类:

按照照粒度分类

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

按照使用方式分类:

 共享锁(Shared Locks):也叫读锁(S锁),多个事务可以同时获取共享锁,用于读取数据,不阻塞其他事务的共享锁。

排他锁(Exclusive Locks):也叫写锁(X锁),只有一个事务可以获取排他锁,用于修改数据,其他事务无法获取共享锁或排他锁。

按照范围分类:

记录锁(Record Locks):用于保护数据表中的单个记录,当事务对记录进行修改时会自动获取记录锁。

间隙锁(Gap Locks):用于保护数据表中的间隙,即两个记录之间的空隙。间隙锁可以防止其他事务在该间隙中插入新记录。

临键锁(Next-Key Locks):是记录锁和间隙锁的组合,用于保护数据表中的记录和间隙。它可以防止其他事务在记录和间隙之间插入新记录。

全局锁

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

语法

-- 加锁

flush tables with read lock ;

-- 释放锁

unlock tables ;

作用和特点

1. 锁定数据库中的所有表:全局锁会锁定整个数据库,阻止其他事务对数据库中的任何表进行修改操作。

2. 阻塞其他事务:获取全局锁的事务会阻塞其他事务对数据库的写操作,确保数据的一致性。

3. 适用于短期维护操作:全局锁通常用于执行短期维护操作,例如备份数据库、导出数据等。

实际应用场景

1. 数据库备份和恢复:在进行数据库备份和恢复操作时,为了避免备份数据的不一致性,可以使用全局锁来锁定整个数据库。

2. 数据库迁移和同步:当需要将数据库迁移到其他服务器或进行数据同步操作时,全局锁可以确保数据在迁移或同步期间不会被修改。

3. 数据库维护和优化:某些数据库维护和优化操作需要对整个数据库进行操作,此时全局锁可以保证操作的有效性和数据的完整性。

表级锁

特点:

1. 锁定整张表:表级锁是在表级别上进行锁定,即一次锁定整个表,阻塞其他事务对该表的写操作。

2. 阻塞其他事务:获取表级锁的事务会阻塞其他事务对同一表的写操作,确保数据的一致性。

3. 简单高效:相对于行级锁,表级锁的实现较为简单,锁的开销较小。

分类

1. 表锁(Table Lock):

- 表锁是一种锁定整个数据表的机制,将锁应用于整张表,阻塞其他事务对该表的写操作。

- 当一个事务获取了对表的表级锁时,其他事务无法对该表进行写操作,但可以进行读操作。

- 表锁适用于对整个表进行维护操作或需要保护整个表的情况,但会对并发性能产生影响,不适用在高并发环境中。

2. 元数据锁(Metadata Lock):

- 元数据锁用于保护数据库中的元数据,如表结构、索引等。

- 当一个事务对某个元数据对象进行修改时,会获取对应的元数据锁,阻塞其他事务对同一元数据对象的访问和修改。

- 元数据锁确保了元数据的一致性和完整性,防止并发操作导致元数据的冲突或损坏。

3. 意向锁(Intention Lock):

- 意向锁是用于协调行级锁和表级锁的机制。

- 当一个事务在某一行上持有行级锁时,意向锁会阻止其他事务获取该表的表级锁,以避免冲突。

- 意向锁分为意向共享锁(Intention Shared Lock)和意向排他锁(Intention Exclusive Lock),用于指示事务在行级别上是否持有共享锁或排他锁。

表锁介绍

表锁有两种:表共享读锁(读锁)和 表独占写锁(写锁)

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

简单语法:lock tables 表名... read/write。

-- 获取表锁

lock tables 表名 write;

-- 执行需要锁定表的操作

update 表名 set column1 = 'value' where id = 1;

-- 释放表锁

unlock tables;

行级锁

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

特点

1. 锁定特定行数据:行级锁是在行级别上进行锁定,即只锁定表中的某一行数据,而不是整个表。 2. 并发性高:相比于表级锁,行级锁可以提供更高的并发性能,允许多个事务同时访问表的不同行数据。

3. 粒度细:行级锁提供了更细粒度的锁定方式,可以避免不必要的锁竞争,提高并发操作效率

分类

行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

行锁介绍

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

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

操作的加锁机制

语法(行级锁需要在事务中使用):

-- 获取读锁、写锁

select ... lock in share mode;

select  ...  for update;

-- 释放锁(MySQL默认开启事务)

commit;//提交事务

rollback;//或者回滚

简单例子

-- 开启事务

start transaction;

-- 获取行级锁

select * from orders where id = 1 for update;

-- select * from orders where order_id = 1 lock in share mode;

-- 执行需要锁定行的操作

update orders set price= 100 where id = 1;

-- 提交事务,释放行级锁

commit;

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

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

相关文章

软件设计模式系列之二十二——状态模式

1 模式的定义 状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变其行为,使得对象的行为看起来像是改变了其类。状态模式将对象的状态抽象成一个独立的类,让对象在不同状态下具有不同的行为,而且可以在运行时切换…

做一个优秀的博士生,时间的付出是必要条件

*图片来自管理学季刊 时间的付出 所有成功的科学家一定具有的共同点,就是他们必须付出大量的时间和心血。这是一条真理。实际上,无论社会上哪一种职业,要想成为本行业中的佼佼者,都必须付出比常人多的时间。有时&…

【知识点随笔分析 | 第六篇】HTTP/1.1,HTTP/2和HTTP/3的区别

前言: 当今互联网已成为人们生活的重要组成部分,而HTTP协议(Hypertext Transfer Protocol)是支持Web通信的基础。随着Web技术的发展和互联网应用的不断增多,HTTP也在不断演进。本文旨在介绍HTTP的演变过程中的三个重要…

【Godot4.1】Godot实现闪烁效果(Godot使用定时器实现定时触发的效果)

文章目录 准备工作创建Sprite2D创建Timer节点 编写脚本完整代码运行效果 准备工作 如果你希望配置C#编写脚本,可以查看如下教程: Godot配置C#语言编写脚本 创建Sprite2D 首先弄一个用于显示的Sprite2D,右键单击任意节点,然后选…

Transformer在小目标检测上的应用

本篇文章是博主在AI、无人机、强化学习等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学…

mysql双主互从通过KeepAlived虚拟IP实现高可用

mysql双主互从通过KeepAlived虚拟IP实现高可用 在mysql 双主互从的基础上, 架构图: Keepalived有两个主要的功能: 提供虚拟IP,实现双机热备通过LVS,实现负载均衡 安装 # 安装 yum -y install keepalived # 卸载 …

反向输出一个三位数

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

手把手教你完成(Java)师生信息管理系统

手把手教你完成(Java)师生信息管理系统 对阶段一学到的知识进行应用,完成练手小项目。同时,也可以当做学校的课设来做。项目已上传 CSDN ,可以按需下载。 一、成果展示 添加学生(查看学生) 删除…

计算机毕业设计 基于SSM的宿舍管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【C进阶】指针笔试题解析

做题之前我们再来回顾一下 对于数组名的理解:除了以下两种情况,数组名表示的都是数组首元素的地址 (1)sizeof(数组名):这里的数组名表示整个数组 (2)&(数…

关掉在vscode使用copilot时的提示音

1. 按照图示的操作File --> Preferences --> Settings 2. 搜索框输入关键字Sound,因为是要关掉声音,所以找有关声音的设置 3. 找到如下图所示的选项 Audio Cues:Line Has Inline Suggetion,将其设置为Off 这样,就可以关掉suggest code时…

使用 Python 给 PDF 添加目录书签

0、库的选择——pypdf 原因:Python Version Support Python 3.11 3.10 3.9 3.8 3.7 3.6 2.7 pypdf>3.0 YES YES YES YES YES YES PyPDF2>2.0 YES YES YES YES YES YES PyPDF2 1.20.0 - 1.28.4 YES YES YES YES YES YES P…

【JAVA】为什么要使用封装以及如何封装

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 前言 Java的封装指的是在一个类中将数据和方法进行封装,使其可以保护起来,只能在该类内部访问,而不允许外部直接访问和修改。这是Java面向对象编程的三…

Python3学习笔记——第一章:基础入门

Python3 有段时间没摸Python了,浏览了一下菜鸟教程,巩固一下基础吧。 Python3学习笔记——第一章:基础入门 文章目录 Python3一、Python3 简介二、Python的安装三、查看 Python 版本四、第一个Python3程序 一、Python3 简介 讲几个对编程有…

【Cesium创造属于你的地球】相机系统

相机系统里面有setView,flyTo,lookAt,viewBoundingsphere这几种方法,以下是相关的使用方法,学起来!!! setView 该方法可以直接切换相机视口,从而不需要通过一个飞入的效…

【Java】什么是继承

目录 什么是继承 继承关系图 idea如何生成继承类图 继承优缺点 什么情况下使用继承模式呢? 继承中变量的访问特点 什么是继承 继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义、追加属性和方法…

蓝桥杯Python scratch C++选拔赛stema个人如何报名?

如果不会操作,可以微信makytony协助。

阅读LINGO-1: Exploring Natural Language for Autonomous Driving

1 背景2 Motivation3 具体过程 1 背景 wayve在9月14日公布了大语言模型和自动驾驶的结合模型LINGO-1,可以用自然语言解释自动驾驶的决策原因。 网页链接:https://wayve.ai/thinking/lingo-natural-language-autonomous-driving/ 但是目前没有论文和开源…

【牛客网】JZ39 数组中出现次数超过一半的数字

题目 思路 思路1 将数组排序,再保证有结果的情况下,此时数组中间的数字就是想要的结果 思路2 在保证有结果的情况下,此时数组的的众数是数组长度的一半以上 所以我们可以通过抵消的做法来找到最终的结果 我们可以从头遍历这个数组,如果两个数不相同,则消去这两个数,最坏的…

SpringBoot的学习

代码书写:耦合度偏高 解决方法:使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象——IcC控制反转 IoC(Inversion of Control)控制反转 使用对象时,由主动new产生对象转换为…