首页 > 数据库 >MySQL 是怎么加锁的

MySQL 是怎么加锁的

时间:2023-10-18 16:55:36浏览次数:36  
标签:怎么 加锁 lock 查询 索引 key MySQL next

MySQL 是怎么加锁的

什么 SQL 语句会加行级锁?

普通select不会加锁,除非是串行化隔离等级。但是select ...for update或者select ...lock in share mode加锁,统称为锁定读。还有update delete语句也会加锁

行级锁有哪些种类?

三种,分别是record lock,gap lock,next-key lock

record lock :只对某一行加锁

  • record分为s和x
    • s:共享锁,和s共享,和x互斥
    • x:排他锁,和s,x都互斥

gap lock:对某个范围加锁

next-key lock:对某个返回和某一行加锁

行级锁分为共享锁(s)和排他锁(x)

MySQL 是怎么加行级锁的?

加锁的对象是索引,加锁的基本单位是next key lock.

如果next key lock可以在其他情况下可以避免幻读,就退化为gap 或者record

唯一索引等值查询

  • 当查询的记录是「存在」的,在索引树上定位到这一条记录后,将该记录的索引中的 next-key lock 会退化成「record」
  • 当查询的记录是「不存在」的,在索引树找到第一条大于该查询记录的记录后,将该记录的索引中的 next-key lock 会退化成「gap lock」

有什么命令可以分析加了什么锁?

通过命令select * from performance_schema.data_locks\G;\G表示每个字段一行

通过LOCK_MODE 可以确认是 next-key 锁,还是间隙锁,还是记录锁:

  • 如果 LOCK_MODE 为 X,说明是 next-key 锁;
  • 如果 LOCK_MODE 为 X, REC_NOT_GAP,说明是记录锁;
  • 如果 LOCK_MODE 为 X, GAP,说明是间隙锁;

为什么唯一索引等值查询并且查询记录存在的场景下,该记录的索引中的 next-key lock 会退化成记录锁?

查到记录,如果插入会因为主键相同报错,不会改变记录

如果修改删除操作可以通过记录锁来阻塞,也不会改变记录

如果查询的值不存在,例如表的id字段有1,2,3,5如果查询4的话,会退化为gap锁。

在5上加了gap就可以避免幻读问题。首先范围是(3,5),只需要保证4不被插入,其他的数据有没有改变都可以,因为其他数据变了也不影响查询4的结果,语句只查询id=4的。

剩下的区域以后再探索吧

标签:怎么,加锁,lock,查询,索引,key,MySQL,next
From: https://www.cnblogs.com/xiuer211/p/17772787.html

相关文章

  • 【JAVA】cron定时怎么记 ss mi hh DD MM 星期 YY
      ......
  • debian12安装mysql5.7
    出于某些原因,不得不捏着鼻子在debian12上安装mysql5.7这里下载debian格式的包,选第一个bundle的安装步骤sudogdebi-nxxx安装的顺序commoncommon-clientclientcommon-serverserver......
  • mysql 运行没错,在mybatis中报错 druid 报错 syntax error, expect RPAREN, actual
    您遇到的问题可能是由于Druid版本较旧导致的。在Druid 1.0.19中,对于某些语法结构的处理存在一些限制和问题。针对您的具体情况,可以尝试以下解决方案:1. 确保SQL语句的括号匹配正确。错误消息"expect RPAREN, actual IDENTIFIER DAY"表明Druid期望一个右括号(RPAREN),但实际上......
  • 苹果应用打开显示连接服务器失败是什么原因?怎么解决?
    大家好,我是咕噜-凯撒,在我们使用苹果设备的过程中,不知道你们有没有遇到过打开应用时候,跳出来一个连接服务器失败的提示信息,这提示不仅令人脑袋大,也影响用户的体验,那到底是什么原因导致的呢,咋解决这个问题呢,下面我自己总结了一下。图片来源:news.gulufenfa.com首先,网络问题可能是导致......
  • MySQL 8.0.34 tar包安装踩坑记录
    环境概述操作系统:Centos7.9MySQL版本:8.0.34错误提示[[email protected]]#/soft/mysql/bin/mysqld--initialize--user=mysql--basedir=/soft/mysql--datadir=/soft/mysql/data/soft/mysql/bin/mysqld:/lib64/libstdc++.so.6:version`CXXABI_1.3.11'not......
  • 财运不好怎么办?如何催旺财运修补财库?
    财富与权贵是人们终其一生所追求的发达、显赫的标志。古人也说“财官多为美好之物,不得损伤”,更有财官印食库藏之说。那么你知道什么是财库吗?为什么要开财库?补财库呢? #什么是财库#所谓财库,就是积存钱财的仓库。我们每个人,自打一生下来就都会有一个财库,财库与一个人的福禄......
  • EDM邮件群发有效果吗?怎么写阅读量高
    在现今各行各业传播营销的浪潮下,EDM邮件群发成了一种十分流行的方式。EDM邮件群发是一种通过主动发送邮件的方式,向大批潜在客户或现有客户发送促销信息的市场推广手段。但很多人在使用EDM邮件群发的过程中,总会遇到一些问题,例如邮件没有得到足够的关注率。那么,EDM邮件群发有效果吗?如......
  • 嵌入式系统,内存不够了该怎么办?
    liwen012023.10.01前言在嵌入式系统中,内存是比较紧缺的资源,特别是在消费类产品中,为了节省成本,一般都会将硬件资源应用到极致。在开发过程中,就经常会遇到,运行内存(RAM)就还差一点,但就是不够用的情况,比如:需要在原系统上添加一个小算法OTA只能将固件放到内存上时需要动态分配......
  • linux centos7 安装mysql
    home目录下新建安装包存放位置cdhomemkdirinstall_packetcd/home/install_packet下载mysql5.7rpm源wgethttp://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm安装下载好的rpm包rpm-ivhmysql57-community-release-el7-8.noarch.rpm安装mysqly......
  • 【MySQL】DATE_FORMAT,DATE_ADD函数用法
    一、示例1select*frombi.testwhereDATE_FORMAT(UPDATE_TIME,'%Y-%m-%d')='2023-09-11';当然 '%Y-%m-%d'是可以根据实际需求调整的  二、示例22.1给时间增加一小时UPDATEbi.testSETUPDATE_TIME=DATE_ADD(UPDATE_TIME,INTERVAL1HOUR);2.2给时间减少......