记录锁,间隙锁,Next-Key Lock

记录锁,间隙锁,Next-Key Lock

  • mysql的锁机制
    • 一、InnoDB行锁的种类
      • 1、记录锁(Record Lock)
        • (1)不加索引,两个事务修改同一行记录
        • (2)不加索引,两个事务修改同一表非同行记录
        • (3)加索引,修改同一行记录,不行
        • (4)加索引,修改同表的不同行,可以修改
      • 2、间隙锁(GAP Lock)
      • 3、记录锁和间隙锁的组合(next-key lock)

mysql的锁机制

  • 数据库锁机制简单来说,就是数据库为了保证数据的一致性,使各种 共享资源 在被访问时变得 有序而设计 的一种规则。
  • MysQL的锁机制比较简单最著的特点是不同的存储引擎支持不同的锁机制。 InoDB支持行锁,(有时也会升级为表锁)MyISAM只支持表锁。
  • 表锁 的特点就是开销小、加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率小,并发度相对低。
  • 行锁 的特点就是开销大、加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率高,并发度高。

今天我们讲锁主要从InnoDB引擎来讲,因为它既支持行锁、也支持表锁。

看完看笔记可以看下这篇博客,非常优秀:
mysql 索引间隙锁_关于mysql innodb间隙锁的一些思考

或者这个间隙锁
一分钟了解Mysql的间隙锁——《深究Mysql锁》

一、InnoDB行锁的种类

  • InnoDB默认的事务隔离级别是RR,并且参数innodb_locks_unsafe_for_binling=0的模式下,行锁有三种。

1、记录锁(Record Lock)

在这里插入图片描述

(1)不加索引,两个事务修改同一行记录

事务一:

begin;
update teacher set teacher_no = 'T2010005' where name = 'wangsi';

事务二:

begin;
update teacher set teacher_no = 'T2010006' where name = 'wangsi';

发现卡住了:
事务一提交了,事务二才获取了。
测试我们发现第二个窗口,一直在处理中
在这里插入图片描述
并且最后会报一个超时的错误!我们把第一个窗口提交了
在这里插入图片描述
然后在执行一次第二个窗口:
在这里插入图片描述
我们发现第二个窗口就可以执行了

(2)不加索引,两个事务修改同一表非同行记录

事务一:

begin;
update teacher set teacher_no = 'T2010005' where name = 'wangsi';

事务二:

begin;
update teacher set teacher_no = 'T2010006' where name = 'sunsi';

发现卡住了:
事务一提交了,事务二才获取了。
说明锁的是表!

(3)加索引,修改同一行记录,不行

在这里插入图片描述事务一:

begin;
update teacher set teacher_no = 'T2010005' where name = 'wangsi';

事务二:

begin;
update teacher set teacher_no = 'T2010006' where name = 'wangsi';

发现卡住了:
事务一提交了,事务二才获取了。

(4)加索引,修改同表的不同行,可以修改

事务一:

begin;
update teacher set teacher_no = 'T2010008' where name = 'wangsi';

事务二:

begin;
update teacher set teacher_no = 'T2010009' where name = 'jiangsi';

我们发现也不行,那我们试试在name字段上加索引!
在这里插入图片描述
发现都可以顺利修改,说明锁的的确是行。
证明行行锁是加在索引上的,这是标准的行级锁。
所以一定要记住,行锁是加在索引上的,如果没有索引就会加到全表上!

2、间隙锁(GAP Lock)

在RR这个级别下 ,为了避免幻读,引入了间隙锁,他锁定的是记录范围,不包含记录本身,也就是不允
许在范围内插入数据。
查看隔离级别:

show variables like '%iso%';

在这里插入图片描述我们现在把表中id是4的数据改成8,然后开始测试:

begin;
SELECT * from teacher where id = 8  or id = 6 for UPDATE;

我们开启一个事务,查询一下id为8或者6的数据,按照间隙锁的条件,现在上面应该是id为(3-6),下面8就是最大的,也就是说,id从3到无穷大,这个时候都是不能插入的,go!这个地方要注意,
1.普通查询是快照读,是不会加锁的!
2.主键和唯一索引只有在where条件没有全部命中的时候才会产生间隙锁!所以我们要先去掉id字段的主键

然后打开新的窗口进行插入

begin; 
insert into teacher values (5,'zhangnan','T888888');

在这里插入图片描述
我们关闭所有窗口,插入一条为9的数据:
在这里插入图片描述
这个时候我们测试下,理论上锁定的是8到无穷大:

begin;
SELECT * from teacher where id = 10 for UPDATE;

执行sql:

begin; 
insert into teacher values (5,'zhangnan','T888888');

在这里插入图片描述
在这里插入图片描述
插入5可以,我们插入20看看

begin; 
insert into teacher values (20,'linda','T232323');
COMMIT;

在这里插入图片描述我们发现又开始卡住了!
当然我们也可以手动加上共享锁:
在这里插入图片描述
我们开始写第一个窗口语句:

BEGIN;
SELECT * from teacher where id < 8;

在这里插入图片描述
我们写第一个窗口语句:

begin; 
insert into teacher values (6,'linda','T232323');
COMMIT;

在这里插入图片描述
执行成功,第一个窗口再次执行,产生幻读
在这里插入图片描述
我们手动加上共享锁:

BEGIN;
SELECT * from teacher where id < 8 lock in share mode;

第二个窗口开始测试:

begin; 
insert into teacher values (5,'linda5','T55555');
COMMIT;

我们发现卡住了,这个地方就加上了一个1-8)的共享锁,这样也能够解决幻读的问题,但是会产生大量的数据锁定:
因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。第二就是尽量不要用范围查询出数据,在去筛选,或者缩小查询范围!

锁的一些总结:【mysql】表锁、行锁、间隙锁、共享锁(读锁)、排他锁(写锁)、Next-Key Locks 之间的关系
如果没有索引,innodb的行锁会升级为表锁,效果和表锁一样,锁住全部索引

3、记录锁和间隙锁的组合(next-key lock)

  • 是记录锁和间隙锁的组合,当InnoDb扫描索引时会先对索引记录加上记录锁,在对索记录两边加上间隙锁。
BEGIN;
SELECT * from teacher where id = 6 or id = 8 for update;

我们发现锁定的范围是6-8,5是可以正常插入的

如果使用的是next-key lock,则5是不可以插入的,但是我们的id有唯一索引,所以next-key lock降级为了GAP Lock

InnoDB有三种行锁的算法:

  • 1,Record Lock:单个行记录上的锁。
  • 2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。
  • 3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。

在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

InnoDB行锁是通过给索引项加锁实现的,如果没有索引,InnoDB会通过隐藏的聚簇索引来对记录加锁。也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样

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

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

相关文章

vue3父子组件props传值,defineprops怎么用?(组合式)

目录 1.基础用法 2.使用解构赋值的方式定义props 3.使用toRefs的方式解构props (1).通过ref响应式变量&#xff0c;修改对象本身不会触发响应式 1.基础用法 父组件通过在子组件上绑定子组件中定义的props&#xff08;:props“”&#xff09;传递数据给子组件 <!-- 父组件…

鸿蒙Next-方法装饰器以及防抖方法注解实现

以下是关于 鸿蒙Next&#xff08;HarmonyOS NEXT&#xff09;中 MethodDecorator 的详细介绍及使用指南&#xff0c;结合了多个技术来源的实践总结&#xff1a; 一、MethodDecorator 的概念与作用 MethodDecorator 是鸿蒙Next框架中用于装饰类方法的装饰器&#xff0c;属于 Ark…

快速入门——状态管理VueX

Vuex介绍 状态管理 每一个Vuex应用的核心都是一个store&#xff0c;与普通的全局对象不同的是&#xff0c;基于Vue数据与视图绑定的特点&#xff0c;当store中的状态发生变化时&#xff0c;与之绑定的视图也会被重新渲染。 store中的状态不允许被直接修改&#xff0c;改变sto…

java进阶学习脑图

今天开始分享我的第一篇博客&#xff0c;先放上我自己花费一个月完成的java进阶学习脑图吧&#xff01; 谁都想像R大一样对JVM可以知无不言&#xff0c;言无不尽&#xff1b; 谁都想像Doug Lea一样可以参与JUC这种核心模块的开发&#xff1b; 但是&#xff0c;不能只停留在想…

【设计师专属】智能屏幕取色器Pro|RGB/HEX双模式|快捷键秒存|支持导出文档|C++ QT

&#x1f525; “1秒锁定千万色值&#xff0c;让灵感不再流失&#xff01;” ✔ 像素级精准捕捉 ✔ 快捷键极速记录 ✔ 数据一键导出 ✔ 开发者/设计师效率神器 "还在手动截图比色&#xff1f;加班改稿只因色差&#xff1f;前端还原总被吐槽&#xff1f; &#x1f449;…

力扣 下一个排列

交换位置&#xff0c;双指针&#xff0c;排序。 题目 下一个排列即在组成的排列中的下一个大的数&#xff0c;然后当这个排列为降序时即这个排列最大&#xff0c;因为大的数在前面&#xff0c;降序排列的下一个数即升序。所以&#xff0c;要是想找到当前排列的下一个排列&…

在 HuggingFace 中使用 SSH 进行下载数据集和模型

SSH 是一种 安全通讯的协议&#xff0c;我们通过配置 SSH 的密钥 来在 Git 上实现 Huggingface 模型的命令行下载。 参考网址&#xff1a;https://huggingface.co/docs/hub/security-git-ssh 点击自己的头像&#xff0c;点击 Add SSH key 在 Windows 上&#xff0c;我们实现已…

【生成模型】【ComfyUI(三)】使用WebAPI批量调用ComfyUI

可以参考【生成模型】【ComfyUI&#xff08;一&#xff09;】Flux与Flux-Fill部署与API调用中Flux-Fill部分 1. 调整Workflow 我们要部署以下workflow 做两个修改 输入改为从Load Image(Base64) 读入图片&#xff0c;当然使用上面的从路径中读图也是可以的输出改为SaveImag…

【多模态大模型】端侧语音大模型minicpm-o:手机上的 GPT-4o 级多模态大模型

MiniCPM-o ,它是一款 开源、轻量级 的多模态大语言模型,目标是在手机等资源受限的环境中实现 GPT-4o 级别的多模态能力! 1. MiniCPM-o:小身材,大能量! MiniCPM-o 的名字已经暗示了它的核心特点:Mini (小巧) 和 CPM (中文预训练模型),最后的 “o” 则代表 Omnimodal …

【C++】深入理解List:双向链表的应用

凭时间赢来的东西&#xff0c;时间肯定会为之作证。 前言 这是我自己学习C的第七篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的vector类知识&#xff0c;没看的同学可以过去看看&#xff1a;【C】探索Vector&#xff1a;灵活的数据存储解决方案-CS…

Spring Cloud源码 - Eureka源码原理分析

Eureka源码原理分析 文章目录 Eureka源码原理分析一&#xff1a;启动过程源码1&#xff1a;初始化环境2&#xff1a;初始化上下文2.1&#xff1a;加载erueka-server配置文件2.2&#xff1a;构造实例信息管理器2.3&#xff1a;初始化erueka-client2.4&#xff1a;处理注册相关的…

2.23操作列表

操作列表 一&#xff1a;遍历整个列表 – for循环 names[xixi, gofy, haha] for name in names:print(f"{name} is very very good good")print(f"{name}&#xff0c;欢迎回家\n")xixi is very very good good xixi&#xff0c;欢迎回家gofy is very ver…

Solidity study

Solidity 开发环境 Solidity编辑器&#xff1a;Solidity编辑器是一种专门用于编写和编辑Solidity代码的编辑器。常用的Solidity编辑器包括Visual Studio Code、Atom和Sublime Text。以太坊开发环境&#xff1a;以太坊开发环境&#xff08;Ethereum Development Environment&am…

Git版本控制系统---本地操作(万字详解!)

目录 git基本配置 认识工作区、暂存区、版本库 添加文件--情况一&#xff1a; 添加文件-情况二: 修改文件: 版本回退&#xff1a; git基本配置 1.初始化本地仓库&#xff0c;注意&#xff1a;一定要在一个目录下进行&#xff0c;一般都是新建一个文件夹&#xff0c;在文件…

IDEA配置JSP环境

首先下载IDEA2021.3&#xff0c;因为最新版本不能简单配置web开发环境。然后新建一个java开发项目&#xff1a; 然后右键创建的项目&#xff0c;添加web框架&#xff1a; 选择web appliciation 在web inf文件夹下创建classes和lib文件夹&#xff1a; 点击file &#xff0c;选择…

前端兼容处理接口返回的文件流或json数据

参考文档&#xff1a;JavaScript | MDN 参考链接&#xff1a;Blob格式转json格式&#xff0c;拿到后端返回的json数据_blob转json-CSDN博客 参考链接&#xff1a;https://juejin.cn/post/7117939029567340557 场景&#xff1a;导入上传文件&#xff0c;导入成功&#xff0c;…

短剧源码部署搭建小程序搭建IAA+IAP混合解锁模式

在当今数字化内容消费迅速增长的时代&#xff0c;短剧作为一种新兴的内容形式&#xff0c;凭借其短小精悍、节奏紧凑的特点&#xff0c;迅速吸引了大量用户。作为一名软件体验测试人员&#xff0c;我有幸体验了一款集创新与实用为一体的短剧小程序。这款小程序不仅在前端用户体…

网络原理---HTTP/HTTPS

通过之前的网络编程&#xff0c;我们已经初步了解UDP和TCP的基本实现方法&#xff0c;接下来我们对其进一步的学习。 在网络编程中&#xff1a; 1.读和写数据通过Socket&#xff0c;通过Socket内置的InputStream和OutputStream(读写的基本单位都是字节&#xff09;。2.当在编…

【Python修仙编程】(二) Python3灵源初探(2)

第一部分&#xff1a;林羽的修仙之旅——字符串与布尔类型的修炼 林羽站在练气期一阶的起点&#xff0c;望着手中的《Python无极心法》秘籍&#xff0c;心中充满了期待。师傅玄天真人在一旁微笑着说道&#xff1a;“林羽&#xff0c;今天我们要修炼的是‘字符串’和‘布尔类型…

【HTML— 快速入门】HTML 基础

准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器&#xff0c;我们在写前端代码时&#xff0c;使用 Sublime Text 打开比使用记事本打开&#xff0c;得到的代码体验更好&#xff0c;比 vscode…