MySQL记录锁、间隙锁、临键锁(Next-Key Locks)详解

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

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

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

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

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

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

一、表级锁、行级锁、页级锁

数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则

MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。

MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定行级锁定页级锁定

1、表级锁

表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。

当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并发度大打折扣

使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。

2、行级锁

行级锁定最大的特点就是锁定对象的颗粒度很小,由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。

虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。

由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁

使用行级锁定的主要是InnoDB存储引擎

3、页级锁

页级锁定是MySQL中比较独特的一种锁定级别。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。

使用页级锁定的主要是BerkeleyDB存储引擎。

4、总结

总的来说,MySQL这3种锁的特性可大致归纳如下:

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

二、临键锁

1、临键锁(Next-Key Locks)

Next-key锁是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁

也可以理解为一种特殊的间隙锁。通过临建锁可以解决幻读的问题。 每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。需要强调的一点是,InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。

查询规则:

  • 唯一索引等值查询:

    • 当查询的记录存在, 临键锁 会退化成行锁

    • 当查询的记录不存在,临键锁会退化成间隙锁

  • 非唯一索引等值查询:

    • 当查询的记录存在,会加 临键锁和 间隙锁两把锁

    • 当查询的记录不存在,只会加 临键锁,然后退化为间隙锁

  • 非唯一索引和主键索引的范围查询的区别:

    • 唯一索引在满足条件时, 临键锁 退化为间隙锁和记录锁

    • 非唯一索引范围查询, 临键锁不会退化 为间隙锁和记录锁

在使用时要注意:
在执行 update /  delete /  select for update 语句时,一定要检查语句是否走了索引,避免全表扫描
Delete 时尽量使用主键 ID(唯一索引) 删除
查询时尽量使用唯一索引进行查询,锁定范围较小

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DBeaver工具连接Hive

DBeaver工具连接Hive 首先解压安装包dbeaver-ce-latest-x86_64-setup.zip,并安装dbeaver-ce-latest-x86_64-setup.exe; 安装Kerberos客户端4.1-amd64.msi; 查看集群节点/etc/hosts文件内容,并追加到C:\Windows\System32\drivers\etc\hosts; 下载集群用户keytab文件,并解压…

动态规划-两个数组的dp问题——718.最长重复子数组

1.题目解析 题目来源 718.最长重复子数组——力扣 测试用例 2.算法原理 1.状态表示 子数组问题不能像子序列问题使用两个区间来表示状态,因为子数组一定是连续的,因此在填第i个位置就需要用到第i-1个位置的值,那么不妨以某个位置为结尾来设…

软件工程 软考

开发大型软件系统适用螺旋模型或者RUP模型 螺旋模型强调了风险分析,特别适用于庞大而复杂的、高风险的管理信息系统的开发。喷泉模型是一种以用户需求为动力,以对象为为驱动的模型,主要用于描述面向对象的软件开发过程。该模型的各个阶段没有…

【日志】392.判断子序列

2024.11.8 【力扣刷题】 392. 判断子序列 - 力扣(LeetCode)https://leetcode.cn/problems/is-subsequence/?envTypestudy-plan-v2&envIdtop-interview-150 整个题从一开始就是打算从双指针的思想往下走的。但是,我设置了四个变量sLeft…

高校宿舍信息管理系统小程序

作者主页:编程千纸鹤 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

【含开题报告+文档+源码】基于SpringBoot的智慧养老医护管理系统

开题报告 随着社会老龄化趋势的不断加深,我国老年人口逐年增长,对养老服务的需求愈发迫切。然而,传统的养老服务模式存在许多不足,如信息孤岛、护理不精准等问题,迫切需要一种创新性的解决方案以提升养老服务的质量和…

【双十一特惠】腾讯云省钱攻略:如何智取云计算资源

前言 双十一不仅是购物的狂欢节,对于云计算用户来说,更是一个节省成本的绝佳时机。腾讯云,作为国内领先的云计算服务商,每年双十一都会推出一系列优惠活动。本文将为您揭开如何在这个购物节中,最大化利用腾讯云的优惠…

IEEE 1588:电信网络的精确时间协议 (PTP)

IEEE 1588:电信网络的精确时间协议 IEEE 1588 PTP 概述PTP 协议特征同步类型IEEE 1588 PTP 角色IEEE 1588 PTP 的工作原理PTP 设备类型PTP 消息类型事件消息一般信息 PTP 时钟类规范PTP 配置文件 https://www.techplayon.com/ieee-1588-precision-time-protocol-ptp…

昇思大模型平台打卡体验活动:基于MindSpore实现GPT1影评分类

如果你对MindSpore感兴趣,可以关注昇思MindSpore社区 大模型平台 平台说明 昇思大模型平台旨在为AI学习者和开发者提供在线学习的项目、模型、大模型体验和数据集的平台。我们也添加了各领域的经典数据集来帮助学习者解决AI学习过程中的一系列难题, 如…

在IDEA中使用Git

一、准备工作 这里我们使用 Gitee 做例子,使用 SSH 协议。看这个文章前最好看一下《》这个文章,了解一下 SSH。 1、生成秘钥对 首先要到 ~/.ssh 目录下进行操作,因为生成的公钥和私钥一般放在这个目录下,Windows 就是在用户目…

Linux下通过sqlplus连Oracle提示字符是乱码▒▒▒[

先参考https://www.cnblogs.com/wrencai/articles/4374451.html 理解下Oracle编码字符集的概念 如下图,刚开始连上是软吗▒▒▒[ 执行export NLS_LANGJAPANESE_JAPAN.AL32UTF8 (这个仅在当前会话起作用)如果好了,说明字符集是这个,不行在尝试别的字符集 如果要永久设置 vim …

Flyweight(享元)

1)意图 运用共享技术有效地支持大量细粒度的对象。 2)结构 享元模式的结构如图 7-36 所示。 其中: Flyweight 描述一个接口,通过这个接口 Flyweight 可以接受并作用于外部状态 ConcreteFlyweight 实现 Flyweight 接口,并为内部状态(如果有)增加存储空…

微信小程序中使用离线版阿里云矢量图标

前言 阿里矢量图库提供的在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 1.下载图标 将阿里矢量图库的图标先下载下来 解压如下 2.转换格式 贴一个地址用于转换格式:Onlin…

大数据之多级缓存方案

多级缓存介绍?多级缓存优缺点,应用场景?多级缓存架构? 多级缓存介绍 多级缓存方案是一种优化手段,通过在多个级别上存储数据来提高应用程序的性能和响应速度。以下是对多级缓存方案的详细解析: 一、多级缓…

jupyter notebook启动和单元格cell

【注意!!!】 本章主要讲解数据分析、挖掘入门及进阶知识 - 通过多篇文章【文字案例】的形式系统化进行描述 数据分析专栏:https://blog.csdn.net/2201_75422674/category_12827743.html - 大家喜欢可以订阅一下,不收费…

街道网格领域的数据大屏,在社区治理方面大显身手。

街道网格领域的数据大屏在社区治理中发挥着重要作用。它可以直观地展示社区的人口分布、治安状况、环境问题等各类信息。 通过实时更新的数据,社区工作人员能够及时掌握动态变化,迅速做出决策。色彩鲜明的图表和图形让复杂的数据一目了然,方…

14、NAT和桥接区别

一、NAT模式 NAT相当于是局域网中的局域网,把192.168.21.1当作外网ip,重新划分了一个网关(192.168.33.x) 二、桥接模式 网桥只是把网络桥接起来,还是原来的网关(192.168.21.x),虚拟机…

k8s 处理namespace删除一直处于Terminating —— 筑梦之路

问题现象 k8s集群要清理某个名空间,把该名空间下的资源全部删除后,删除名空间,一直处于Terminating状态,无法完全清理掉。 如何处理 为什么要记录下这个处理的步骤,经过查询资料,网上也有各种各样的方法&…

鸿蒙多线程开发——Worker多线程

1、概 述 1.1、基本介绍 Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本进行耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。 创建Worker的线…

Python实现SSA智能麻雀搜索算法优化BP神经网络回归模型(优化权重和阈值)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着人工智能技术的发展,机器学习算法在各个领域的应用越来越广泛。其中,神…