【MySQL进阶之路 | 高级篇】行锁之临键锁和插入意向锁

news2024/9/23 15:28:05

1. 临键锁(Next-Key Locks)

有时候我们既想锁住某条记录,又想阻止其他事务在该记录前边的间隙插入新记录,所以InnoDB就提出了一种称之为Next-Key Locks的锁,官方的类型名称为:LOCK_ORDINARY,我们也可以简称为next-key锁。Next-KeyLocks是在存储引擎innodb、事务级别在可重复读的情况下使用的数据库锁,innodb默认的锁就是Next-Keylocks。比如,我们把id值为8的那条记录加一个next-key锁的示意图如下:

next-key锁的本质就是一个记录锁和一个gap锁的合体,它既能保护该条记录,又能阻止别的事务将新记录入被保护记录前边的间隙。

例子:给id为8的记录添加临键锁.禁止添加id是8的记录和id为8的上一条记录之间添加记录。

select * from stdent where id <= 8 and id > 3 for update;

2. 插入意向锁(Insert Intention Locks)

我们说一个事务在插入一条记录时需要判断一下插入位置是不是被别的事务加了gap锁( next-key锁也包含gap锁),如果有的话,插入操作需要等待,直到拥有gap锁的那个事务提交。但是InnoDB规定事务在等待的时候也需要在内存中生成一个锁结构,表明有事务想在某个间隙中插入新记录,但是现在在等待。InnoDB就把这种类型的锁命名为Insert Intention Locks,官方的类型名称为: LOCK_INSERT_INTENTION,我们称为插入意向锁。插入意向锁是一种Gap锁,不是意向锁,在insert操作时产生。

同一区间(gap)插入位置不同的多条数据时,事务之间不需要互相等待。假设存在两条值分别为4和7的记录,两个不同的事务分别试图插入值为5和6的两条记录,每个事务在获取插入行上独占的(排他)锁前,都会获取(4,7)之间的间隙锁,但是因为数据行之间并不冲突,所以两个事务之间并不会产生冲突(阻塞等待)。总结来说,插入意向锁的特性可以分成两部分:

  • 插入意向锁是一种特殊的间隙锁―一间隙锁可以锁定开区间内的部分记录。
  • 插入意向锁之间互不排斥,所以即使多个事务在同一区间插入多条记录,只要记录本身(主键、唯一索引)不冲突,那么事务之间就不会出现冲突等待。

注意,虽然插入意向锁中含有意向锁三个字,但是它并不属于意向锁而属于间隙锁,因为意向锁是表锁而插入意向锁是行锁。

比如:

现在T1为id值为8的记录加了一个gap锁,然后T2和T3事务分别想向student表中插入id值分别为4,5的两条记录,所以现在为id值为8的记录加的锁的示意图如下:

从图中可以看到,由于T1持有gap锁,所以T2和T3需要生成一个插入意向锁的锁结构并且处于等待状态。当T1提交后会把它获取到的锁都释放掉,这样T2和T3就能获取到对应的插入意向锁了。(本质上就是把插入意向锁对应锁结构的is_waiting属性改为false),T2和T3之间也不会相互阻塞,它们可以同时获得到id为8的插入意向锁,然后执行插入操作。事实上插入意向锁并不会阻止别的事务继续获取该记录上任何类型的锁。

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

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

相关文章

Ubuntu20.04 设置静态ip

Ubuntu 从 17.10 开始&#xff0c;已放弃在 /etc/network/interfaces 里固定 IP 的配置&#xff0c;interfaces 文件不复存在&#xff0c;即使配置也不会生效&#xff0c;而是改成 netplan 方式 &#xff0c;配置写在 /etc/netplan/01-netcfg.yaml &#xff0c;50-cloud-init.y…

手把手教你使用 Python 制作超级玛丽游戏

编写一个完整的《超级玛丽兄弟》&#xff08;Super Mario Bros.&#xff09;风格的游戏需要涉及到多个方面&#xff0c;包括游戏循环、玩家控制、敌人AI、碰撞检测、关卡设计、得分系统等等。由于这是一个复杂的项目&#xff0c;我将为你提供一个更加详细的框架&#xff0c;并解…

Xstate inspect状态图的使用 和 原理

状态图的好处之一是&#xff0c;在将状态图组合在一起的过程中&#xff0c;您可以探索流程中所有可能的状态。这种探索将帮助您避免代码中的错误和错误&#xff0c;因为您更有可能涵盖所有可能发生的情况。 因为状态图是可执行的&#xff0c;所以它们既可以表现为图&#xff0…

【YashanDB知识库】update/delete未选中行时,v$transaction视图没有事务,alter超时问题

问题现象 1、alter table修改表字段名&#xff0c;卡住&#xff0c;超时。 2、查看v$transaction事务视图&#xff0c;没有看到事务记录。 3、问题单&#xff1a;调整表结构时超时 问题风险及影响 无风险 问题影响版本 客户版本&#xff1a;22.2.8.3 问题发生原因 del…

2.1.卷积层

卷积 ​ 用MLP处理图片的问题&#xff1a;假设一张图片有12M像素&#xff0c;那么RGB图片就有36M元素&#xff0c;使用大小为100的单隐藏层&#xff0c;模型有3.6B元素&#xff0c;这个数量非常大。 识别模式的两个原则&#xff1a; 平移不变性&#xff08;translation inva…

MySQL学习(15):SQL优化:load、order by、group by

1.大批量插入数据指令load 当需要大批量插入数据时&#xff0c;insert的效率比较低&#xff0c;此时可以使用load命令 使用方法如下&#xff1a; &#xff08;1&#xff09;客户端连接服务端时&#xff0c;加上参数--local-infile mysql --local-infile -u root -p&#xf…

Java实现短信验证码服务

1.首先这里使用的是阿里云的短信服务。 package com.wzy.util;; import cn.hutool.captcha.generator.RandomGenerator; import com.aliyun.dysmsapi20170525.Client; import com.wzy.entity.Ali; import org.springframework.stereotype.Component;/*** Author: 顾安* Descri…

2024年铜川宜君半程马拉松,暴晒+爬坡152安全完赛

1、赛事背景 2024年7月21日&#xff0c;我参加了2024年铜川宜君半程马拉松赛&#xff0c;7月举办的赛事很少&#xff0c;全国都算温度比较高的&#xff0c;虽然宜君是一个山城&#xff0c;还是会担心气温会高。 临开赛1、2周&#xff0c;陕西区域降水比较多&#xff0c;赛前一…

C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…

在Linux中,部署及优化Tomcat

tomcat概述 自 2017 年 11月编程语言排行榜 Java 占比 13%,高居榜首&#xff0c;Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性深受广大程序员喜爱。本章主要学习如何部署 Tomcat 服务&#xff0c;根据生产环境实现多个虚拟主机的配置&#xf…

在el-table单元格中通过div绘制圆、直线和对角线

<el-table-column label"电源屏零层端子" align"center" prop"name2" width"220px"><template #default"scope"><div class"bigCircle"></div><div class"smallCircle">…

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-EIP&#xff0c;下面是详细介绍。 一&#xff0c;设备主要功能 1、捷米特J…

eqmx上读取数据处理以后添加到数据库中

目录 定义一些静态变量 定时器事件的处理器 订阅数据的执行器 处理json格式数据和将处理好的数据添加到数据库中 要求和最终效果 总结一下 定义一些静态变量 // 在这里都定义成全局的 一般都定义成静态的private static MqttClient mqttClient; // mqtt客户端 private s…

科研绘图系列:R语言组合堆积图(stacked barplot with multiple groups)

介绍 通常堆积图的X轴表示样本,样本可能会存在较多的分组信息,通过组合堆积图和样本标签分组信息,我们可以得到一张能展示更多信息的可发表图形。 加载R包 knitr::opts_chunk$set(warning = F, message = F) library(tidyverse) library(cowplot) library(patchwork)导入…

R包:plot1cell单细胞可视化包

介绍 plot1cell是用于单细胞数据seurat数据对象的可视化包。 安装 ## You might need to install the dependencies below if they are not available in your R library. bioc.packages <- c("biomaRt","GenomeInfoDb","EnsDb.Hsapiens.v86&qu…

基于飞腾FT2000的嵌入式计算机系统

作为中国嵌入式计算机的领导厂家&#xff0c;是最早进入轨道交通领域的 工业级AFC嵌入式计算机系列产品&#xff0c;充分体现了轨道交通新一代AFC主流新技术的各种特点&#xff0c;为轨道交通AFC系统的升级换代提供了良好的系统平台。 标准化 采用开放式架构的Intel新一代主流…

力扣高频SQL 50题(基础版)第八题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题1581. 进店却未进行过交易的顾客题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a;总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题 1581. 进店…

操作系统杂项(十)

目录 一、简述socket中select、epoll的使用场景和区别 1、使用场景 2、区别 二、epoll水平触发和边缘触发的区别 三、简述Reactor和Proactor模式 1、Reactor 2、Proactor 3、区别 四、简述同步和异步的区别&#xff0c;阻塞和非阻塞的区别 1、同步与异步 2、阻塞与非…

SpringBoot入门:如何新建SpringBoot项目(保姆级教程)

在本文中&#xff0c;我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的&#xff0c;因为我发现有些java的初学者&#xff0c;甚至工作10年的老员工居然并不会新建一个SpringBoot项目&#xff0c;所以特别出了一篇文章来教大家新建一个SpringBoo…

状态机 XState 使用

状态机 一般指的是有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;&#xff0c;又可以称为有限状态自动机&#xff08;Finite State Automation&#xff0c;FSA&#xff09;&#xff0c;简称状态机&#xff0c;它是一个数学模型&#xff0c;表示有限个…