MySQL(三)锁 ----- 行锁和锁机制

MySQL之锁机制(表锁和行锁) MySQL之锁机制(表锁和行锁)锁的定义锁的分类表锁表锁特点表锁(读锁)表锁(写锁)总结表锁定分析行锁(重点)行锁特点并发事务产生的问题事务隔离级别模拟数据行锁基本演示行锁演示结论索引失效间隙锁什么是间隙锁间隙锁演示间隙锁的危害面试题:如何锁定一行行锁分析InnoDB_row_lock字段说明优化建议总结 锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种共享资源,如何保证数据并发访问的一致性、有效性是所有数 阅读详情

InnoDB 锁机制

InnoDB存储引擎支持行级锁
其大类可以细分为共享锁和排它锁两类

  • 共享锁(S):允许拥有共享锁的事务读取该行数据。当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得共享锁,但另外的事务无法获得同一行数据上的排他锁

  • 排它锁(X):允许拥有排它锁的事务修改或删除该行数据。 当一个事务拥有一行的排他锁时,另外的事务在此行数据上无法获得共享锁和排它锁,只能等待第一个事务的锁释放

除了共享锁和排他锁之外, InnoDB也支持意图锁。该锁类型是属于表级锁,表明事务在后期会对该表的行施加共享锁或者排它锁。所以对意图锁也有两种类型:

  • 共享意图锁(IS): 事务将会对表的行施加共享锁
  • 排他意图锁(IX): 事务将会对表的行施加排它锁

举例来说select … for share mode语句就是施加了共享意图锁,而select … for update语句就是施加了排他意图锁

首先它俩都是表级别的锁,因为InnoDB是支持行锁的,当某些行已经上了X锁之后,再想对这个表上锁的话,就得确认当前表中没有任何X锁,在没有意向锁的情况下,就得一行一行去判断,这样效率会非常低下,在有了意向锁之后,就不需要一行一行判断了,举个例子:

select * from user where id=1 for update;
当一个事务对id=1这行数据上了X锁之后,就会对user表也加一个IX锁。

LOCK TABLES user READ;
这时想要给表加上读锁,但是发现表上有IX锁,所以会阻塞无法执行。类似的如果一个事务对一行数据加上共享锁

select * from user where id=1 lock in share mode;
就会给对应的表加上IS锁。这时候如果执行

LOCK TABLES user WRITE;
也会因为表上有IS锁而阻塞。

行级锁

行级锁是施加在索引行数据上的锁,比如SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE语句是在t.c1=10的索引行上增加锁 ,来阻止其他事务对对应索引行的insert/update/delete操作。

当一个InnoDB表没有任何索引时, 则行级锁会施加在隐含创建的聚簇索引上,所以说当一条sql没有走任何索引时,那么将会在每一条聚集索引后面加X(排它)锁,这个类似于表锁,但原理上和表锁应该是完全不同的

开启两个会话链接,链接同一个数据库,模拟排他锁

session1:
 
##update加排他锁
mysql> set autocommit=0;  #模拟开启一个事务会话
Query OK, 0 rows affected (0.00 sec)
mysql> update temp set name='aa' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
 
session2:
##update等待第一个锁释放 
mysql> update temp set name='bb'where id=2;
 
session1
##commit释放锁
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
 
session2
等待结束释放锁
update操作才会成功
Query OK, 1 row affected (5.81 sec)
Rows matched: 1  Changed: 1  Warnings: 0

给temp表加一个主键索引在看看

session1:
update加排它锁
 
set autocommit=0;
update temp set name='a' where id=1;
 
session2:
update temp set name='b' where id=2;
update不需要等待第一个锁释放,直接执行成功
 
session1: 进行提交事务
commit;

结论:当一个InnoDB表没有任何索引时, 则行级锁会施加在隐含创建的聚簇索引上,所以说当一条sql没有走任何索引时,那么将会在每一条聚集索引后面加X(排它)锁,这个类似于表锁,但原理上和表锁应该是完全不同的

间隔锁

当 我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件 的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”, InnoDB也会对这个“间隙”加锁

间隔锁是施加在索引记录之间的间隔上的锁, 锁定一个范围的记录、但不包括记录本身,
比如SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE语句,尽管有可能对c1字段来说当前表里没有=15 的值,但还是会阻止=15的数据的插入操作,是因为间隔锁已经把索引查询范围内的间隔数据也都锁住了

  • 间隔锁的使用只在部分事务隔离级别才是生效的

  • 间隔锁只会阻止其他事务的插入操作

gap lock的前置条件
  • 事务隔离级别为REPEATABLE-READ, innodb_locks_unsafe_for_binlog参数为0,且sql走的索引为非唯一索引(无论是等值检索还是范围检索)
  • 事务隔离级别为REPEATABLE-READ, innodb_locks_unsafe_for_binlog参数为0,且sql是一个范围的当前读操作,这时即使不是非唯一索引也会加gap lock
update加排他锁和间隔锁
set autocommit=0;
mysql> update temp2 set name='abc' where id between 4 and 6;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0  Changed: 0  Warnings: 0
 
session2:
insert into temp2 values(4,'d');
会等待第一个锁释放
 
session1:
释放锁
commit;
 
session2:
Query OK, 1 row affected (7.65 sec)
等待结束释放锁 插入数据成功

例子如果链接1的update语句是update temp set name=‘abc’ where id >4; 而链接2的
插入数据的id=4时也会被阻止,是因为记录中的3~4之间也算是间隔

Next-key锁

在默认情况下, mysql的事务隔离级别是可重复读,并且innodb_locks_unsafe_for_binlog
参数为0,这时默认采用next-key locks。所谓Next-Key Locks, 就是记录锁和间隔锁的结合,即除了锁住记录本身,还要再锁住索引之间的间隙。

插入意图锁

插入意图锁是在插入数据时首先获得的一种间隔锁, 对这种间隔锁只要不同的事务插 入的数据位置是不一样的,虽然都是同一个间隔,也不会产生互斥关系

比如有一个索引有4和7两个值,如果两个事务分别插入5和6两个值时,虽然两个事务都会在索引4和7之间施加间隔锁,但由于后续插入的数值不一样,所以两者不会互斥

比如下例中事务A对索引>100的值施加了排他间隔锁,而事务B在插入数据之前就试图先施加插入意图锁而必须等待

CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
INSERT INTO child (id) values (90),(102);
#开启事务A
START TRANSACTION;
#增加排它间隔锁
SELECT * FROM child WHERE id > 100 FOR UPDATE;
+-----+
| id  |
+-----+
| 102 |
+-----+
1 row in set (0.00 sec)
 
 
另一个session窗口,开启事务B:
START TRANSACTION;
INSERT INTO child (id) VALUES (101);
这时候会有锁等待

自增锁

自增锁是针对事务插入表中自增列时施加的一种特殊的表级锁,即当一个事务在插入自增数据时,另一个事务必须等待前一个事务完成插入,以便获得顺序的自增值

APK静态分析(取证角度)——理论部分 APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。 阅读详情

相关推荐

开源光标主题实战:从Moshi Monsters到自定义指针的完整指南

光标主题是操作系统个性化的重要组成部分,它通过替换系统默认指针图标来改变视觉交互体验。其原理在于操作系统允许用户自定义指针资源文件,这些文件定义了不同状态下的光标图像。从技术价值看,一套设计良好的光标主题不仅能提升桌面美观度,还能增强用户的情感连接和操作愉悦感,是低成本高回报的数字幸福感提升方案。在应用场景上,无论是开发者、设计师还是普通用户,都可以通过更换光标主题来个性化工作环境。本文以热门的Moshi Monsters开源光标项目为例,深入解析了光标主题的设计逻辑、系统适配方案以及二次创作方法,涵盖了W

weixin_30879833的博客 548

MySQL的锁机制

目录mysql的锁机制一、InnoDB行锁的种类1、记录锁(Record Lock)2、间隙锁(GAP Lock)3、记录锁和间隙锁的组合(next-key lock)二、表锁三、InnoDB的锁类型1、读锁2、写锁3、MDL锁4、意向锁四、从另一个角度区分锁的分类1、乐观锁2、悲观锁五、锁等待和死锁六、如何避免死锁七、MVCC,多版本并发控制(1)什么是当前读和快照读?(2)当前读,快照读和MVCC的关系(3)MVCC能解决什么问题(4)MVCC的实现原理(5)Read View(读视图)八、Redo l

weixin_52448922的博客 826

计算机网络实验六 RIP 配置实验

Man! What can I say?

AClerk的博客 1591

在隔离级别为读未提交的情况下,为什么一个事务在修改数据时已经加了写锁,还是会被另一个事务读取到未提交的数据?

读未提交下的写锁

qq_42961707的博客 1253

阿里开源最强数字人工具 EchoMimicV2,本地部署(一)

EchoMimicV2是阿里推出的半身人体AI数字人项目,基于参考图片、音频剪辑和手部姿势序列生成高质量动画视频,确保音频内容与半身动作的一致性。现在本地部署,安装体验一下。

缘分天空的专栏 4614

YOLOv8改进——引入可变形卷积DCNv3

本文只讲解在YOLOv8的代码中添加DCNv3的操作流程, 具体的原理参见上述的链接~是pytorch实现的版本,只要基础的pytorch环境安装正确就不会出错。是C++实现版本,必须先在上一步编译成功,或者安装好了轮子,否则会报错。但是在实际的训练过程中,C++版本的运行速度更快,推荐使用C++版本。(具体怎么修改,都可以自己决定,然后通过实验看看效果如何)文件夹,该文件夹下的内容就是实现DCNv3算子的核心代码。中,下图中的列表里添加。

zyw2002的博客 3万+

MySQL锁机制和加锁原理

原文章请参考:https://blog.youkuaiyun.com/qq_38238296/article/details/88362999 首先对MySQL锁进行划分: **1,按照锁的粒度划分:**行锁、表锁、页锁 **2,按照锁的使用方式划分:**共享锁、排它锁(悲观锁的一种实现) **3,还有两种思想上的锁:**悲观锁、乐观锁 4,InnoDB中有几种行级锁类型:Record Lock、Gap Lock、Next-key Lock Record Lock:在索引记录上加锁 **Gap Lock:**间隙锁

lazyboy2的博客 1547

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

XiaoqiangClub的博客 7129

mysql的行锁加在哪个位置_MySQL的数据锁 加在哪?

MySQL的数据锁 加在哪?MySQL的数据锁 加在哪?此篇文章探讨MySQL数据库的锁,讨论MySQL各种语句将如何加锁,以及加锁的“效果”,主要针对默认的InnoDb引擎。基于MySQL5.6之后的版本。有心力的可以直接看MySQL官方文档,说的更为详细:14.7.3由InnoDB中的不同SQL语句设置的锁锁分类按类型分,MySQL有锁:行锁,最普通的锁,其实是加在索引上的锁。表锁,直接加在整...

weixin_28778341的博客 2857

⑩电子产品拆解分析-家用无线遥控开关433Mhz

①免布线随意贴,装上就能使用解决单线开关烦恼;②遥控配对简单,无线通讯距离长,信号可穿墙;

a6662580的博客 4683

【银河麒麟桌面系统】自定义ISO镜像操作实践

本文详细介绍了麒麟操作系统Kylin-Desktop-V10-SP1的ISO镜像定制流程。通过挂载原始镜像、解压文件系统、进入chroot环境进行系统定制(包括文件替换和软件管理),最终重构squashfs并生成新ISO。关键步骤包括:挂载镜像到mnt目录、解压filesystem.squashfs、替换源配置文件、在chroot环境中清理系统、重新生成squashfs文件以及使用mkisofs命令创建新镜像。文章特别标注了x86和ARM架构的不同命令参数,并提供了安装测试验证方法。整个过程展示了从原始镜像

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2339

MySQL 表锁和行锁机制(很详细)

MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑。遇到了可别乱踩。通过本章内容,带你学习MySQL的行锁,表锁,两种锁的优缺点,行锁变表锁的原因,以及开发中需要注意的事项。还在等啥?经验等你来拿! MySQL的存储引擎是从MyISAM到InnoDB,锁从表锁到行锁。后者的出现从某种程度上是弥补前者的...

kuyuyingzi的专栏 2万+

【ROS2】手眼标定:moveit2_handeye_calib使用详解

moveit2_handeye_calib MoveIt2 官方的 手眼标定功能包,包含标定插件、图形化界面和示例程序。提供基于 ArUco/ChArUco 标定板的采集与求解功能。标定板下载aruco在线生成器。

郭老二 246

面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁

腾讯云数据库负责人林晓斌说过:“我们面试MySQL同事时只考察两点,索引和锁”。言简意赅,MySQL锁的重要性不言而喻。 本文通过同事“侨总”的一场面试,带你通俗易懂的掌握MySQL各种锁机制,希望可以帮到你!

陈哈哈的菜园子 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL锁机制详解:从全局锁到行锁

全局锁就是对整个数据库实例加锁。锁定后,整个库处于只读状态,所有更新操作都会被阻塞。-- 加全局锁-- 简称 FTWRL-- 释放全局锁表锁是对整张表加锁,控制对表的并发访问。-- 加表级读锁(共享锁)-- 加表级写锁(排他锁)-- 释放表锁MDL锁(Metadata Lock)是MySQL自动管理的一类锁,用于保护表结构定义,防止在查询过程中表结构被修改。MDL读锁:当对表进行增删改查操作时,加MDL读锁MDL写锁:当对表结构进行变更操作时,加MDL写锁行锁。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3161

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MySQL 表锁和行锁机制

MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑。遇到了可别乱踩。通过本章内容,带你学习MySQL的行锁,表锁,两种锁的优缺点,行锁变表锁的原因,以及开发中需要注意的事项。还在等啥?经验等你来拿! MySQL的存储引擎是从MyISAM到InnoDB,锁从表锁到行锁。后者的出现从某种程度上是弥补前者的...

xts5701046的博客 6万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?

在上文我们曾小小的提到过,在索引失效的情况下,MySQL会把所有聚集索引记录和间隙都锁上,我们称之为锁表,或叫行锁升表锁.那么对于行锁升表锁,有的同学误以为行锁 升级变成了 表锁,但实际上锁的类型并没有发生变化✍️,还是行锁! 哪些场景会造成行锁升表锁?无索引 或 索引失效! 如何避免? 如何分析排查? 本文将给你答案!

天罡gg的专栏 5502

深入理解 MySQL 中的锁机制:行锁、表锁及其他锁类型

锁是数据库管理系统(DBMS)中一种控制对数据库资源访问的机制。当多个用户或事务试图同时访问同一数据时,锁能够确保数据的一致性,避免发生数据损坏或不一致的情况。锁可以分为多种类型,包括共享锁、排他锁、行锁和表锁等。MySQL 还提供了自定义锁的机制,允许用户在应用层面进行锁管理。用户锁可以通过GET_LOCK()和函数来实现。这种锁不受 InnoDB 存储引擎的限制,可以用于控制任何需要同步的资源。灵活性:可以根据具体需求自定义锁的名称和作用范围。跨会话。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

MySQL锁相关——锁机制、表锁、行锁、死锁、锁优化等

MySQL不同的存储引擎支持不同的锁机制,所有存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现。默认情况下表锁和行锁都是自动获得的,不需要额外的命令,但某些情况下用户需要明确的进行行锁或进行事务的控制,以便确保整个事务的完整性,这样就需要使用事务控制和锁定语句来完成。默认情况下,写锁比读锁具有更高的优先级:当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,然后再给读锁队列中等候的获取锁请求。对于普通的select语句,InnoDB不会加任何锁。

weixin_43816711的博客 5131

Mysql行锁和表锁

总体来说,加索引可以减少对数据的锁定范围,提高数据库的并发性能,减少锁表延迟。但同时也需要注意索引的选择和使用,因为不合适的索引可能会增加数据库的负担,导致性能下降。在MySQL中,默认情况下,使用的是自动锁定(autocommit)模式,即每个SQL语句都会自动提交一个事务,并释放相应的锁。以上问题涉及到了数据库基本概念、锁的工作原理、性能优化等方面,通过深入理解这些问题,可以更好地应对相关的面试考核。在MySQL中,行锁和表锁是两种常见的锁定机制,它们用于控制对数据库中行或表的并发访问。

on_the_roadZZZ的博客 4981

【MySQL】深入理解MySQL锁机制:从行锁、表锁到死锁

想象一个银行转账场景:用户A向用户B转账100元。事务1:A账户减100元事务2:B账户加100元如果这两个操作同时被多个线程执行A扣了两次钱,但B只收到一次→数据不一致!锁(Lock)就是MySQL用来保证并发安全和数据一致性的核心机制。它确保在并发环境下,多个事务对同一数据的访问是有序、可控的。两个或多个事务互相等待对方释放锁,导致所有事务都无法继续。sql深色版本-- 事务1-- 锁住A-- 等待B(被事务2锁住)-- 事务2-- 锁住B。

josuke66的博客 2304

Mysql锁机制之行锁、表锁、死锁

乐观锁用的最多的就是数据的版本记录来体现 version ,其实就是一个标识。 例如:update test set a=a-1 where id=100 and a> 0; 对应的version就是a字段,并不一定非得要求有一个字段叫做version,要求的是有这个字段,同时当满足这个条件的时候才会触发

点滴记忆,分享成长之路 4273

MySQL 的锁机制:行锁、表锁、间隙锁与死锁排查

在 MySQL 高并发环境中,锁机制(Locking)是确保数据一致性和事务隔离性的重要手段。不同类型的锁(行锁、表锁、间隙锁)在**控制数据竞争**的同时,也影响数据库的**并发性能**。此外,错误的锁使用可能导致**死锁(Deadlock)**,影响系统稳定性。本篇文章将深入解析 **MySQL 的锁机制**,包括 **行锁、表锁、间隙锁** 的工作原理,并介绍 **死锁的成因、排查方法及优化策略**,帮助开发者更高效地管理数据库并发事务。

2254

mysql 行锁转换为表锁_[转]MySQL 表锁和行锁机制

MySQL 表锁和行锁机制行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑。遇到了可别乱踩。通过本章内容,带你学习MySQL的行锁,表锁,两种锁的优缺点,行锁变表锁的原因,以及开发中需要注意的事项。还在等啥?经验等你来拿!MySQL的存储引擎是从MyISAM到InnoDB,锁从表锁到行锁。后者的出现从某种程度上是弥补前者的不足。比...

weixin_36428079的博客 1854

数据安全之路:深入了解MySQL的行锁与表锁机制

本文深入研究了MySQL数据库中行锁与表锁的实现方式,比较了它们的特点与适用场景。通过详细的分析和实例演示,读者将能够更好地理解如何在数据库中使用行锁和表锁以确保数据的安全性和性能。

todoitbo的博客 6020
上一篇: MySQL(二)锁 ----- 表锁
下一篇: MySQL(四)多版本并发控制 ----- MVCC
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值