【Mysql】-锁机制-GAP锁

在 MySQL 的 InnoDB 存储引擎中,Gap 锁(间隙锁)是一种用于防止幻读的锁机制。幻读是指在一个事务中,多次执行相同的查询,结果集却不同,通常是由于其他事务插入了新的行。为了防止这种情况,InnoDB 使用 Gap 锁来锁定索引记录之间的间隙,从而阻止其他事务在这些间隙中插入新的行。

Gap 锁的作用

  • 防止幻读:通过锁定索引记录之间的间隙,Gap 锁可以防止其他事务在这些间隙中插入新的行,从而避免幻读现象。
  • 维护事务隔离性:在某些事务隔离级别下(如 REPEATABLE READ),Gap 锁帮助确保事务的一致性和隔离性。

Gap 锁的工作原理

  • 锁定范围:Gap 锁不仅锁定具体的索引记录,还锁定索引记录之间的间隙。例如,如果索引中有值 10 和 20,那么 Gap 锁会锁定 (10, 20) 之间的间隙。
  • 锁定方式:Gap 锁是共享的,这意味着多个事务可以在同一间隙上持有 Gap 锁。但是,如果有事务在某个间隙上持有 Gap 锁,其他事务就不能在这个间隙中插入新的记录。

示例

假设有一个表 orders,其结构如下:

Sql
CREATE TABLE orders (id INT PRIMARY KEY,order_number INT
);

并且表中已经存在以下数据:

idorder_number
110
220
情景 1: 查询并锁定

假设一个事务执行以下查询:

Sql

SELECT * FROM orders WHERE order_number = 15 FOR UPDATE;

由于 order_number = 15 的记录不存在,InnoDB 会在 order_number 索引上的 (10, 20) 间隙上放置一个 Gap 锁。这防止了其他事务在 (10, 20) 之间插入新的记录。

情景 2: 插入操作

假设另一个事务尝试插入一个新的记录:

Sql

INSERT INTO orders (id, order_number) VALUES (3, 15);

由于第一个事务已经在 (10, 20) 间隙上放置了 Gap 锁,第二个事务将被阻塞,直到第一个事务提交或回滚。

Gap 锁和 Next-Key 锁

  • Next-Key 锁:Next-Key 锁是 Gap 锁和 Record 锁的组合。它不仅锁定索引记录本身(Record 锁),还锁定索引记录之间的间隙(Gap 锁)。这样可以同时防止幻读和不可重复读。
  • 默认行为:在 REPEATABLE READ 隔离级别下,InnoDB 默认使用 Next-Key 锁来防止幻读。

如何查看 Gap 锁

你可以通过 Performance Schema 来查看当前的锁情况。例如,查询 performance_schema.data_locks 表可以显示当前活跃的锁信息。

Sq

SELECT * FROM performance_schema.data_locks WHERE LOCK_TYPE = 'RECORD' AND LOCK_MODE = 'GAP';

这个查询会显示当前系统中所有的 Gap 锁。

总结

Gap 锁是 InnoDB 用来防止幻读的一种锁机制。它锁定索引记录之间的间隙,从而阻止其他事务在这些间隙中插入新的行。通过这种方式,InnoDB 能够在 REPEATABLE READ 隔离级别下提供更高的事务一致性。理解 Gap 锁对于优化并发性能和解决锁冲突问题非常重要。

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

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

相关文章

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器,实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件,主要包括&a…

软考-软件设计师(10)-专业英语词汇汇总与新技术知识点

场景 以下为高频考点、知识点汇总。 软件设计师上午选择题知识点、高频考点、口诀记忆技巧、经典题型汇总: 软考-软件设计师(1)-计算机基础知识点:进制转换、数据编码、内存编址、串并联可靠性、海明校验码、吞吐率、多媒体等: 软考-软件设计师(1)-计算机基础知识点:进制…

C语言复习第3章 函数

目录 一、函数介绍1.1 函数是什么1.2 C语言中函数的分类1.3 函数原型1.4 高内聚 低耦合1.5 C语言main函数的位置 二、函数的参数2.1 实参和形参2.2 函数的参数(实参)可以是表达式2.3 传值与传址(swap函数)2.4 明确形参是实参的临时拷贝2.5 void(如果不写函数返回值 默认是int)2…

python 爬虫 入门 三、登录以及代理。

目录 一、登录 (一)、登录4399 1.直接使用Cookie 2.使用账号密码进行登录 可选观看内容,使用python对密码进行加密(无结果代码,只有过程分析) 二、代理 免费代理 后续:协程,…

如何在OceanBase中新增系统变量及应用实践

因为系统变量涉及复杂的工程文件,为防止新增变量操作对软件系统的潜在影响,OceanBase为多数开发者设计了一套高效的编程框架。此框架允许开发者在新增及使用系统变量时,仅需专注于变量定义的细节。具体来说,通过运行一个Python脚本…

树莓派设置中文界面

树莓派设置中文界面 1.安装中文字体。 执行命令:sudo apt-get -y install ttf-wqy-zenhei 2.设置显示中文。 执行命令:sudo raspi-config 选择:4 Localisation Options --> 1 Change Locale 按空格键在前面打勾或去掉勾&#xff0…

Windows 11开发环境搭建与应用开发实践

1. 引言 随着微软发布Windows 11,操作系统领域迎来了许多新的功能和变化。Windows 11不仅优化了用户界面,还强化了性能与安全性,增加了对开发者友好的特性,使其成为一个理想的开发平台。无论是桌面应用、Web应用,还是跨平台移动应用,Windows 11都为开发者提供了强大的支…

企业级调度器 LVS

集群和分布式基础知识 系统性能的扩展方式 当一个系统,或一个服务的请求量达到一定的数量级的时候,运行该服务的服务器的性能和资源上限, 很容易成为其性能瓶颈。除了性能问题之外,如果只部署在单台服务器上,在此服务…

gitee建立/取消关联仓库

目录 一、常用指令总结 二、建立关联具体操作 三、取消关联具体操作 一、常用指令总结 首先要选中要关联的文件,右击,选择Git Bash Here。 git remote -v //查看自己的文件有几个关联的仓库git init //初始化文件夹为git可远程建立链接的文件夹…

uniapp uni.uploadFile errMsg: “uploadFile:fail

uniapp 上传后一直显示加载中 1.检查前后端上传有无问题 2.检查失败信息 await uni.uploadFile({url,filePath,name,formData,header,timeout: 30000000, // 自定义上传超时时间fail: async function(err) {$util.hideAll()// 失败// err 返回 {errMsg: "uploadFile:fai…

速盾:cdn能加速游戏吗?

CDN(内容分发网络)是一种通过分布在全球不同地区的服务器来缓存和传输网络内容的技术。它的主要目的是提高内容的传输速度和用户体验。虽然CDN主要用于加速网站的访问和内容传输,但它也可以应用于游戏加速。 在传统的在线游戏中,…

SpringCloud学习:Openfeign组件实现服务调用和负载均衡

OpenFeign:服务调用与负载均衡(服务端接口) 是什么:通过OpenFeign可以实现服务调用和负载均衡 OpenFeign是一个声明性web服务客户端, 怎么用:服务提供者提取公共接口用FrignClient标注,服务调…

【Flutter】基础入门:开发环境搭建

Flutter 是一个强大的跨平台框架,支持在 Android、iOS、Windows、Linux、Web 等多种平台上开发应用。下面将详细介绍如何在各个平台上构建 Flutter 开发环境,并使用相同的项目代码构建出一个可以在多个平台运行的跨平台 Demo。 Flutter 环境配置&#x…

浙大数据结构全题解汇总(C++实现)

浙大MOOC练习题题解汇总链接 浙大数据结构:01-复杂度1 最大子列和问题 浙大数据结构:01-复杂度2 Maximum Subsequence Sum 浙大数据结构:01-复杂度3 二分查找 浙大数据结构:02-线性结构1 两个有序链表序列的合并 浙大数据结构&am…

kernel32.dll下载地址:如何安全地恢复系统文件

关于从网络上寻找kernel32.dll的下载地址,这通常不是一个安全的做法,而且可能涉及到多种风险。kernel32.dll是Windows操作系统的核心组件之一,负责内存管理、进程和线程管理以及其他关键系统功能。因为kernel32.dll是系统的基础文件&#xff…

信息安全工程师(57)网络安全漏洞扫描技术与应用

一、网络安全漏洞扫描技术概述 网络安全漏洞扫描技术是一种可以自动检测计算机系统和网络设备中存在的漏洞和弱点的技术。它通过使用特定的方法和工具,模拟攻击者的攻击方式,从而检测存在的漏洞和弱点。这种技术可以帮助组织及时发现并修补漏洞&#xff…

【数据结构与算法】链表(上)

记录自己所学&#xff0c;无详细讲解 无头单链表实现 1.项目目录文件 2.头文件 Slist.h #include <stdio.h> #include <assert.h> #include <stdlib.h> struct Slist {int data;struct Slist* next; }; typedef struct Slist Slist; //初始化 void SlistI…

webAPI中的节点操作、高级事件

一、节点操作 1.删除节点 node.removeChild(); 方法从node节点中删除一个子节点&#xff0c;返回删除的节点 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

C++20中头文件ranges的使用

<ranges>是C20中新增加的头文件&#xff0c;提供了一组与范围(ranges)相关的功能&#xff0c;此头文件是ranges库的一部分。包括&#xff1a; 1.concepts: (1).std::ranges::range:指定类型为range&#xff0c;即它提供开始迭代器和结束标记(it provides a begin iterato…

【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO

【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO 1.背景2.下载IDE3.安装IDE1.背景 TI:Texas instruments即德州仪器公司。 https://www.ti.com.cn/CCSTUDIO即Code Composer Studio。 Code Composer Studio 是适用于 TI 微控制器和处理器的集成开发环境 (IDE)。 它包含一整套用于…