mysql数据库 行级锁,间隙锁和临键锁详解

news2024/11/22 2:07:12

目录

准备

查看锁命令

演示

普通的select语句

共享锁与排他锁

无索引行锁升级为表锁

间隙锁&临键锁

索引上的等值查询(索引为唯一索引)

索引上的等值查询(索引为普通索引)

索引上的范围查询(唯一索引)


准备

我的mysql版本是8。

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` tinyint unsigned DEFAULT NULL COMMENT '年龄',
  `gender` tinyint unsigned DEFAULT NULL COMMENT '性别, 1:男, 2:女',
  `phone` varchar(11) DEFAULT NULL COMMENT '手机号',
  PRIMARY KEY (`id`),
  KEY `id_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';

演示锁的时候,就通过上面这张表来演示一下。

查看锁命令

可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

常见的 lock_mode 值有:

  1. IS (Intent Shared Lock):意图共享锁。表示事务打算获取共享锁,但当前只在上级资源(如表)上锁定,而不是具体的行或页。

  2. IX (Intent Exclusive Lock):意图排他锁。表示事务打算获取排他锁,但当前只在上级资源(如表)上锁定。

  3. S (Shared Lock):共享锁。多个事务可以同时持有共享锁,允许读取资源,但禁止修改。

  4. X (Exclusive Lock):排他锁。一个事务独占此锁,可以读取和修改资源,其他事务无法访问该资源。

  5. SIX (Shared Intent Exclusive Lock):共享意图排他锁。表示事务允许共享访问某些资源,同时声明可能会对部分资源进行排他操作。

  6. SRX (Shared Read Exclusive Lock):共享读排他锁。类似于共享锁,同时表示将对某些资源进行排他访问。

  7. S+ (Next-key Shared Lock):下一键共享锁,InnoDB的特殊锁模式,用于实现间隙锁机制,防止幻读。

  8. X+ (Next-key Exclusive Lock):下一键排他锁,InnoDB的特殊锁模式,用于锁定间隙及其后的索引键,适用于更新或删除操作。

  9. AUTO-INC (Auto-Increment Lock):自增锁,专门用于处理AUTO_INCREMENT列,确保插入操作的原子性和顺序。

演示

普通的select语句

普通的select语句,执行时,不会加锁。

共享锁与排他锁

(1)select...lock in share mode,加共享锁,

共享锁与共享锁之间兼容。 

共享锁与排他锁之间互斥。

(2)update语句加排他锁

排他锁与排他锁之间互斥。

当客户端一执行update语句,会为id为1的记录加排他锁;

客户端二如果也执行update语句,更新id为1的数据,也要为id为1的数据加排他锁,但是客户端二会处于阻塞状态,因为排他锁之间是互斥的。

直到客户端一把事务提交了,才会把这一行的行锁释放,此时客户端二解除阻塞。

无索引行锁升级为表锁

在两个客户端中执行如下操作:

在客户端一中开启事务,并执行update语句,更新name为白眉鹰王的数据,也就是id为1的记录。

然后在客户端二中更新iid为1和d为3的记录,却不能直接执行,会处于阻塞状态,为什么呢?

原因就是此时客户端一根据name字段进行更新时,name字段是没有索引的,如果没有索引,此时行锁会升级为表锁(因为行锁是对索引项加的锁,而name没有索引)。

接下来,我们再针对建立索引但的字段age,索引建立之后,再次做一个测试:

此时我们可以看到,客户端一开启事务,根据age进行更新。而客户端二在更新id为3的数据时,更新成功,并未进入阻塞状态。

这样就说明,我们根据索引字段进行更新操作,就可以避免行锁升级为表锁的情况。

间隙锁&临键锁

索引上的等值查询(索引为唯一索引)

(1)当对唯一索引上进行等值查询时,给存在的记录加锁时, 是记录锁。

这意味着锁定的对象是索引记录本身,而不是记录之间的间隙。REC_NOT_GAP 锁用于精确锁定某个索引记录,以防止其他事务对该记录的修改或删除,但不影响索引记录之间的空隙。这种锁常用于阻止其他事务更新或删除当前事务所锁定的索引记录,同时允许其他事务插入新的记录到该索引记录之间的间隙。 

(2)当对唯一索引上进行等值查询时,给不存在的记录加锁时, 优化为间隙锁。

X,GAP 表示当前事务在一个索引的间隙上加了一个排他锁。这意味着在当前事务持有该锁期间,其他事务不能在该间隙中插入新记录。这种锁定机制通常用于防止并发事务产生幻读问题,从而确保事务隔离级别为 REPEATABLE READ 或 SERIALIZABLE

索引上的等值查询(索引为普通索引)

当非唯一普通索引进行等值查询时,向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。

分析一下,我们知道InnoDB的B+树索引,叶子节点是有序的双向链表。

假如我们要根据这个二级索引查询值为18的数据,并加上共享锁,我们是只锁定18这一行就可以了吗?

并不是,因为是非唯一索引,这个结构中可能有多个18的存在,所以,在加锁时会继续往后找,找到一个不满足条件的值(当前案例中也就是29)。此时会对18加临键锁,并对29之前的间隙加锁。

(1)如果等值查询的记录存在,

(2)如果等值查询的记录不存在, 

索引上的范围查询(唯一索引)

当对唯一索引上进行范围查询时,会访问到不满足条件的第一个值为止。

(1)查询的条件为id>=10,并添加共享锁。 此时我们可以根据数据库表中现有的数据,将数据分为4个部分:

  • [10]
  • (10,16]
  • (16,20]
  • (20,+∞] 

所以数据库数据在加锁时,就是将10加了行锁,16的临键锁(包含16及16之前的间隙),20的临键锁(包含20及20之前的间隙),正无穷的临键锁(正无穷及之前的间隙)。

(1)如果查询的条件为id>=11,并添加共享锁。 此时我们可以根据数据库表中现有的数据,由于id=11不存在,因此将数据分为3个部分:

  • (10,16]
  • (16,20]
  • (20,+∞] 

所以数据库数据在加锁时,就是加了16的临键锁(包含16及16之前的间隙),20的临键锁(包含20及20之前的间隙),正无穷的临键锁(正无穷及之前的间隙)。

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

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

相关文章

.NET 8 跨平台高性能边缘采集网关

目录 前言 项目介绍 通道 插件 设备 变量 项目特点 可视化操作 脚本支持 自定义插件支持 性能 断线缓存 完整可商用的边缘网关 项目插件 采集插件 业务插件 项目展示 1、ThingsGateway 演示地址 2、登录页面 3、系统首页 4、网关管理 5、网关状态 6、网关…

【区块链+金融服务】基于区块链的一站式绿色金融开放平台 | FISCO BCOS应用案例

科技的进步为绿色金融发展提供了新的机遇,但银行、企业、第三方金融机构等在进行绿色金融业务操作过程中, 存在着相关系统和服务平台建设成本高、迭代难度大、数据交互弱、适配难等痛点。 基于此,中碳绿信采用国产开源联盟链底层平台 FISCO …

Element-01.快速入门

1.什么是Element 2.快速入门 第二步引入ElementUI组件库,在当前的工程目录下的main.js文件中引入。 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.use(ElementUI); 第一…

Heckman 模型及 Stata 具体操作步骤

目录 一、文献综述 二、理论原理 三、实证模型 四、稳健性检验 五、程序代码及解释 六、代码运行结果 一、文献综述 Heckman 模型自提出以来,在众多领域得到了广泛且深入的应用。例如,在劳动经济学领域,Heckman(1979&#xf…

CSS小玩意儿:霓虹灯卡片

一&#xff0c;效果 二&#xff0c;代码 1&#xff0c;搭个框架 主题是一个圆角矩形&#xff0c;其中有垂直、水平居中的文字。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>霓虹灯卡片 - 步骤1…

区块链技术在Facebook中的潜力:未来趋势与挑战

数据安全的新高度 区块链技术以其去中心化和不可篡改的特性&#xff0c;正在成为提升数据安全和隐私保护的重要工具。Facebook作为全球最大的社交媒体平台之一&#xff0c;正积极探索如何将区块链技术应用于其平台&#xff0c;以增强用户数据的安全性和隐私保护。Facebook在应…

数字化营销在公域场景中的无限可能

在如今的商业领域&#xff0c;公域场景为企业提供了广阔的发展空间&#xff0c;而数字化营销则成为了企业在这些场景中脱颖而出的关键利器。 ​ 一、电商平台营销 当企业在淘宝、京东等大型电商平台开设店铺&#xff0c;数字化营销便开始大显身手。 企业不仅能踊跃参与像双十…

新华三H3CNE网络工程师认证—OSPF基础

OSPF是N1&#xff08;初级&#xff09;阶段比较重要的知识点&#xff0c;路由协议当中非常重要的一个知识点。 文章目录 一、常用的三大路由协议二、静态路由的问题1、无法适应规模较大的网络2、 无法动态响应网络变化 三、动态路由协议分类1、按工作区域分类2、按工作机制及算…

manim官方文档 _ 快速入门板块 _ 汉化 | 辅助快速理解manim功能

注 &#xff1a; 在此之前&#xff0c;请按照安装中的步骤安装 Manim 并确保其正常运行。有关在 Jupyterlab 或 Jupyter notebook 中使用 Manim 的信息&#xff0c;请参阅 IPython magic command的文档。 文章目录 概述实例一 &#xff1a;绘制一个圆形1、启动新项目 let s go2…

美股动荡,散户逆势抄底!科技股成香饽饽

最近&#xff0c;美股市场可不太平&#xff0c;各大指数纷纷下跌。面对这样的行情&#xff0c;不少投资者都有些慌了。但你知道吗&#xff1f;有一群人却在此时看到了机会&#xff0c;他们就是散户投资者&#xff01; 逆势操作&#xff0c;散户“抄底” 8月份&#xff0c;美股…

SpringBoot整合定时任务@Scheduled

SpringBoot自带的定时任务非常简单操作&#xff0c;其实就是一个Scheduled注解。 第一步&#xff1a;创建类&#xff0c;定义执行定时任务的方法 package com.oracle.springboottimer.timer;import org.springframework.scheduling.annotation.Scheduled; import org.springfr…

STM32—WDG看门狗

1.WDG简介 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系统的可靠性和安全性 看门狗本质是一个定时…

使用 Python和 SQLite 打造一个简单的数据库浏览器

在日常开发中&#xff0c;我们常常需要快速查看和操作SQLite数据库中的数据。虽然有许多现成的工具可以完成这一任务&#xff0c;但有时你可能想要一个更为简单、可定制的解决方案。在这篇博客中&#xff0c;我将带你一步步构建一个简单的SQLite数据库浏览器&#xff0c;它可以…

怎么将文档翻译英文?多语言翻译的4个方法

当你准备将文档翻译成英文并发送给海外客户时&#xff0c;你可能会同时感到兴奋和焦虑。 兴奋的原因是&#xff0c;你的业务即将扩展到全球市场&#xff1b;焦虑的原因是&#xff0c;如果翻译出现错误&#xff0c;可能会造成尴尬的局面。 不过&#xff0c;不必过于担心。今天…

高速信号的眼图、加重、均衡

目录 高速信号的眼图、加重、均衡眼图加重均衡线性均衡器CTLE判决反馈均衡器DFE 高速信号的眼图、加重、均衡 眼图 通常用示波器观察接收信号波形的眼图来分析码间串扰和噪声对系统性能的影响&#xff0c;从而估计系统优劣程度&#xff0c;因而眼图分析是高速互连系统信号完整…

电信天翼网关TEWA-1000E/G等系列光猫新版固件破解超级密码

实际操作机型TEWA-1006G&#xff0c;参考教程电信天翼网关TEWA-1000E/G等系列光猫破解超级密码。 之前&#xff0c;在同一个光猫上使用上述教程成功拿到了超级密码&#xff0c;但是一年之后电信远程更新了固件&#xff0c;该破解方法部分失效&#xff0c;于是我在研究之后找到了…

2024开源资产管理系统推荐 8款免费开源IT资产管理系统/软件

开源资产管理系统 开源资产管理系统是帮助企业管理、跟踪和优化其资产的强大工具。这些系统能够自动记录资产的详细信息&#xff0c;如采购日期、使用情况、维护记录等&#xff0c;从而实现资产的全生命周期管理。企业可以通过这些系统优化资产使用效率&#xff0c;减少资产闲…

8月15日笔记

masscan安装使用 首先需要有c编译器环境。查看是否有c编译器环境&#xff1a; gcc -v如果系统中已经安装了 GCC&#xff0c;这个命令将输出 GCC 的版本信息。如果未安装&#xff0c;你会看到类似于 “command not found” 的错误消息。 如果没有下载&#xff0c;使用如下命令…

SAP中如何导出物料的评估类清单?

接到内部产品控制同事请求&#xff0c;希望从系统中帮忙导出物料的评估类清单。查询到评估类对应的数据表是T025。通过SE16可以查询和输出。 输入查询条件后&#xff0c;在出现的清单中输出到本地文件&#xff0c;存储成excel文件后发给用户&#xff0c;任务完成。 这样就可以导…

掌握内网渗透之道,成为实战高手,看《内网渗透实战攻略》就够了

【文末送书】【文末送书】今天推荐一本网络安全领域优质书籍《内网渗透实战攻略》 文章目录 * 前言如何阅读本书目录文末送书 前言 ![在这里插入图片描述](https://img- blog.csdnimg.cn/direct/fd88c968fc5349aea8945ee5345d6881.jpeg) 当今&#xff0c;网络系统面临着越…