一文详解mysql 的锁

MySQL锁是用于管理数据库中的并发操作的一种机制,它可以确保数据的一致性和完整性。
按范围划分:包括全局锁、表级锁、页级锁和行级锁。
按类型划分:包括间隙锁、临键锁和记录锁。
按级别划分:包括共享锁(S锁)和排它锁(X锁),以及意向锁。

全局锁

全局锁是MySQL中锁的一种粒度,它影响的是整个数据库实例。当施加全局锁时,数据库中的所有表都无法进行写操作,即所有的数据更新语句(增删改)和数据定义语句(如创建、修改、删除表结构等)都会被阻塞。

典型的使用场景是在执行全库逻辑备份时,通过施加全局锁来确保数据的一致性,从而防止备份过程中的数据不一致问题。这对于保证备份数据的完整性和准确性非常关键。

-- 施加全局读锁(共享锁)
FLUSH TABLES WITH READ LOCK;-- 执行备份操作...-- 释放全局读锁
UNLOCK TABLES;

表级锁

每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。

手动增加表锁:

lock table 表名称 read(write),表名称2 read(write);

例如lock tables t1 read, t2 write; 命令,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行读 t1、读写 t2 的操作。连写 t1 都不允许,自然也不能在unlock tables之前访问其他表。
查看表上加过的锁:

show open tables;

删除表锁:

unlock tables;

页级锁

页级锁的锁定粒度和加锁时间介于表级锁和行级锁之间,适用于对相邻一组记录的操作。
以下是页级锁的示例:

-- 开启事务
START TRANSACTION;-- 执行查询操作,并使用LOCK IN SHARE MODE对结果集进行共享锁定
SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;-- 执行更新操作,并使用FOR UPDATE对结果集进行排他锁定
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition FOR UPDATE;-- 提交事务
COMMIT;

SELECT … LOCK IN SHARE MODE语句会将查询结果集进行共享锁定,允许其他事务读取该结果集,但不允许对其进行修改。而UPDATE … FOR UPDATE语句则会将更新的结果集进行排他锁定,防止其他事务对该结果集进行读取或修改。

行锁

每次操作锁住一行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高,但是加锁慢、开销大,容易发生死锁现象。
InnoDB与MYISAM的最大不同有两点:

  • InnoDB支持事务
  • InnoDB支持行级锁

InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。

共享锁和排他锁

  • 读锁/共享锁(Shared Lock,S锁):针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。

  • 写锁/排它锁(Exclusive Lock,X锁):允许事务对某些数据进行删除或更新。如果当前操作还没完成,其他事务的S和X锁是会被阻塞的,确保在多个事务中,对同一资源,只有一个事务能写入,并防止其他用户读取正在写入的资源。

S锁X锁
S锁兼容不兼容
X锁不兼容不兼容

共享锁称为读锁,但不是读一定获取共享锁。正常情况下,select某一条记录时,只需要获取该记录的共享锁。但是,在有些情况下可能select记录时就获取记录的排他锁,来禁止别的事务来读取该记录,为此,MySQL提供了两种特殊的select语句:
对读取的记录加S锁:

SELECT... LOCK IN SHARE MODE; SELECT ... FOR SHARE [NOWAIT|SKIP LOCKED];-- 8.0特性
——NOWAIT表示不等待直接报错,
——SKIP LOCKED表示立即返回,但返回的结果不包含被锁定的行

此时允许其他事务读取该记录(给该记录加S锁),但是不允许其他事物给该记录加X锁,需要阻塞等待当前事务提交后获取锁。

对读写的记录加X锁:

select * from user where id=1 for update;

如果当前事务中有该语句,会给记录增加X锁,不允许其他事务获取该记录的S锁和X锁。

意向锁

意向锁的作用就是加快表锁的检查过程。
意向锁是由存储引擎自己维护的,用户无法手动获取,在为数据行加共享/排他锁之前,InooDB会先获取该数据所在表的对应意向锁。

  • 意向共享锁(intention shared lock,IS)
    在使用InnoDB引擎的表里对某些记录加上「共享锁」之前,需要先在表级别加上一个「意向共享锁」:
——事务要获取某些行的S锁,必须先获得表的 IS 锁。
SFLFCT column FROM table ... LOCK IN SHARE MODE;
  • 意向排他锁(intention exclusive lock,IX)
    在使用InnoDB引擎的表里对某些纪录加上「独占锁」之前,需要先在表级别加上一个「意向独占锁」:
——事务要获取某些行的X锁,必须先获得表的IX锁。
SELECT column FROM table ... FOR UPDATE; 

间隙锁

间隙锁的作用是防止其他事务在当前事务未提交的情况下插入新的记录,从而避免幻读现象的发生。当一个事务执行了范围查询操作时,MySQL会自动为该范围加上间隙锁,以防止其他事务在该范围内插入新的记录。

需要注意的是,间隙锁的加锁范围是左开右闭区间,即不包括范围的左右端点。例如,如果一个事务执行了以下范围查询操作:

SELECT * FROM table_name WHERE column > 10 AND column < 20;

那么MySQL会为该范围加上间隙锁,锁定从10到20之间的所有记录,但不包括10和20这两个值本身。

临键锁(Next-key Locks)

临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间,是一个左开右闭区间。临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。
每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。需要强调的一点是,InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。
Next-Key Locks是行锁与间隙锁的组合。像上面那个例子里的这个(3,20]的整个区间可以叫做临键锁。

记录锁

记录锁也叫行锁,例如:

select * from emp where empno = 1 for update;

它会在 id=1 的记录上加上记录锁,以阻止其他事务插入,更新,删除 id=1 这一行。

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

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

相关文章

如何在Windows轻量应用服务器上安装和配置SSH?

如何在Windows轻量应用服务器上安装和配置SSH&#xff1f; 检查OpenSSH的可用性&#xff1a;首先&#xff0c;需要以管理员身份打开PowerShell并运行命令Get-WindowsCapability - Online | Where-Object Name - like OpenSSH*来检查OpenSSH服务是否可用。如果服务未启动或不可…

day03_Vue_Element

文章目录 01.Ajax1.1 Ajax 概述1.2 同步异步1.3 原生Ajax 2. Axios2.1 Axios的基本使用2.2 Axios快速入门2.3请求方法的别名2.4 案例 3 前后台分离开发3.1 前后台分离开发介绍 04 YAPI4.1 YAPI介绍4.2 接口文档管理 05 前端工程化5.1 前端工程化介绍5.2 前端工程化入门5.2.1 环…

【Python】变量的引用

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

2024.3.4 作业

1、流式域套接字 1>tcp服务端实现 #include<myhead.h> int main(int argc, const char *argv[]) {//1、创建套接字int sfd socket(AF_UNIX, SOCK_STREAM, 0);if(sfd -1){perror("socket error");return -1;}//2、判断套接字文件是否存在&#xff0c;如果…

5G工业智能网关保障煤矿安全生产

随着物联网技术发展与煤矿需求的持续激增&#xff0c;矿山矿井的分布范围广泛、户外环境恶劣等管理问题急需解决&#xff0c;而物联网网关工业级设计能够无惧恶劣环境干扰&#xff0c;轻松解决户外网络部署问题。 工业网关通过采集矿井内的各类传感器数据对矿井进行远程监控&a…

MySQL中的大表优化方案

当MySQL单表记录数过大时&#xff0c;数据库的CRUD性能会明显下降&#xff0c;一些常见的优化措施如下&#xff1a; 1&#xff1a;限定数据的范围 务必禁止不带任何限制数据范围条件的查询语句。比如&#xff1a;我们当用户在查询订单历史的时候&#xff0c;我们可以控制在一个…

【NR 定位】3GPP NR Positioning 5G定位标准解读(五)

前言 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;二&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位…

[GYCTF2020]EasyThinking --不会编程的崽

看标题就知道&#xff0c;这大概率是关于thinkphp的题目。先尝试错误目录使其报错查看版本号 thinkphp v6.0.0&#xff0c;在网上搜索一下&#xff0c;这个版本有一个任意文件上传漏洞。参考以下文章。 https://blog.csdn.net/god_zzZ/article/details/104275241 先注册一个账…

VL53L8CX驱动开发(1)----驱动TOF进行区域检测

VL53L8CX驱动开发----1.驱动TOF进行区域检测 概述视频教学样品申请源码下载主要特点硬件准备技术规格系统框图应用示意图区域映射生成STM32CUBEMX选择MCU 串口配置IIC配置LPn 设置X-CUBE-TOF1串口重定向代码配置Tera Term配置演示结果 概述 VL53L8CX是一款8x8多区域ToF测距传感…

STM32(6)中断

1.中断 1.1 中断的概念 STM32的中断&#xff1a; 1.2 中断优先级 用数字的大小表示中断优先级的高低&#xff0c;数字的范围&#xff1a;0000--1111&#xff08;二进制&#xff09;&#xff0c;即0-15&#xff0c;共16级优先级。 进一步对这4位二进制数进行划分&#xff0c;可…

demo型xss初级靶场

一、环境 XSS Game - Ma Spaghet! | PwnFunction 二、开始闯关 第一关 看看代码 试一下直接写 明显进来了为什么不执行看看官方文档吧 你不执行那我就更改单标签去使用呗 ?somebody<img%20src1%20onerror"alert(1)"> 防御&#xff1a; innerText 第二关…

区块链技术深度赋能多元行业应用的全景解析

随着科技的日新月异&#xff0c;区块链这一颠覆性技术正以前所未有的速度从理论走向实践&#xff0c;并在众多行业中扮演着关键性的变革角色。其独特的分布式账本、去中心化运作、公开透明以及数据不可篡改等核心特性&#xff0c;为金融、物联网&#xff08;IoT&#xff09;、供…

常见的排序算法-(字解版)

快速排序算法 例如&#xff1a;3 1 2 7 5 6 第一次基数&#xff1a; 3 [] 1 2 7 5 6 3 和 6 5 7 比都比 3 大 &#xff0c; 位置不变 [] 1 2 7 5 63 和 2 比 &#xff0c;大于 2 放在右边。 2 1 [] 7 5 63 和 1 比 &#xff0c;大于 1 位置不变。 2 1 3 7 5 6 把 3 的左边和右…

分账系统哪个好 盘点2024年好用的四款分账系统

分账系统在现代商业活动中扮演着至关重要的角色&#xff0c;为企业提供了高效、准确的分账管理。那么&#xff0c;你知道2024年哪几款分账系统最好用呢&#xff1f;跟着小编的脚步去看看吧&#xff01; 一、商淘云 商淘云是广州商淘信息科技有限公司旗下品牌&#xff0c;它提…

SPI是什么?

SPI是“串行外设接口”&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;它是一种高速的、全双工、同步的通信协议&#xff0c;主要用于芯片与外设之间进行高速数据交换。SPI通信协议通常由一个主设备和一个或多个从设备组成。其核心是主设备控制时钟信号…

ShardingJdbc分库分表-浅谈分表原理

文章目录 为什么要分库分表一、分库分表二、不停机分库分表数据迁移 为什么要分库分表 一般的机器&#xff08;4核16G&#xff09;&#xff0c;单库的MySQL并发&#xff08;QPSTPS&#xff09;超过了2k&#xff0c;系统基本就完蛋了。最好是并发量控制在1k左右。这里就引出一个…

matplotlib从起点出发(14)_Tutorial_imshow_origin_extent

0 总述 imshow()允许你将图像&#xff08;将进行颜色映射——基于norm和cmap——的2D数组或将按原样使用的3D RGB(A)的数组&#xff09;渲染到数据空间中的矩形区域。最终渲染中图像的方向由原点和范围关键字参数&#xff08;以及生成的AxesImage实例上的属性&#xff09;和Ax…

一.数据分析简介

目录 一、了解数据分析 1.1 什么是数据分析 1.2 数据分析的重要性 1.3 数据分析的基本流程 数据获取 数据处理 1.4 数据分析的应用场景 客户分析 营销分析 二、数据分析工具 jupyter 2.1 编辑器安装 2.2 Jupyter快捷使用 一、了解数据分析 学习数据分析&#xff0…

[激光原理与应用-75]:激光器设计过程中,功率下降的主要原因大全

目录 前言&#xff1a;激光器的本质是“电”转“光”的设备 一、激光器功率下降的原因 二、寿命到期导致功率下降的因素 三、光损耗导致激光器输出功率下降的因素 四、激光器中的能量转化不完全导致的功率下降的因素 五、温度变化导致激光器功率下降的影响因素 六、材料…

LeetCode28 最后一个单词的长度

题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 示例 1&#xff1a;输入&#xff1a;s "Hello World" 输出&#x…