MySQL有哪些锁?

1.MySQL有哪些锁?

  • 全局锁
  • 表级锁
    • 表锁
    • 元数据锁
    • 意向锁
  • 行级锁
    • 记录锁
    • 间隙锁
    • 临键锁
    • 临时意向锁

我了解的是MySQL的锁可以分为全局锁、表级锁、行级锁。

我比较熟悉的是表级锁和行级锁,如果我们对表结构进行修改时,MySQL就会对这个表结构加一个元数据锁。

行级锁目前只有InnoDB存储引擎实现了,主要有记录锁、间隙锁、临键锁、插入意向锁。

2.MySQL是怎么加锁的【可重复读隔离级别】?

加锁的对象是索引,加锁的基本单位是临键锁,临键锁是前开后闭区间,间隙锁是前开后开区间。但是在某些场景下,临键锁是会退化成记录锁或间隙锁的,那就是在使用记录锁或间隙锁就能避免幻读的场景下。

推荐文章:MySQL 是怎么加锁的?

2.1 对于等值查询那么他会怎么加锁?

首先我们可以想到,查询的这个是唯一索引呢,还是非唯一索引,或者说没有索引。

在可重复读隔离级别下,以上三种情况都是有可能的。

如果是唯一索引,还要看查看的记录是否存在,如果存在,那么这条记录加的锁变成记录锁,其它还是临键锁;如果不存在则加间隙锁。

如果是非唯一索引,也要看记录是否存在,如果存在,由于非唯一索引可能有多个相同的值,所以它会进行一个扫描,对于符合条件的二级索引记录加临键锁,最后扫描到第一个不符合条件的二级索引记录就停止,然后对第一个不符合条件的记录加间隙锁,同时,在其主键索引上加记录锁。如果不存在,对第一个不符合条件的二级索引记录加间隙锁。

如果没有索引或没有命中,那就全表扫描,都加临键锁。

相关推荐
byte轻骑兵4 分钟前
突破文档型数据库迁移困境:金仓多模方案破解电子证照系统国产化难题
数据库
xdpcxq10291 小时前
EF Core框架数据库连接管理
java·jvm·数据库
期待のcode2 小时前
MyBatis框架—延迟加载与多级缓存
java·数据库·后端·缓存·mybatis
老华带你飞2 小时前
小区服务|基于Java+vue的小区服务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·小区服务管理系统
计算机学姐2 小时前
基于微信小程序的扶贫助农系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
柯南二号2 小时前
【Java后端】MyBatis 和 MyBatis-Plus (MP) 的区别
java·数据库·tomcat
C++chaofan2 小时前
游标查询在对话历史场景下的独特优势
java·前端·javascript·数据库·spring boot
程序新视界2 小时前
MySQL的两种分页方式:Offset/Limit分页和游标分页
后端·sql·mysql
小蒜学长2 小时前
springboot房地产销售管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
0wioiw03 小时前
PostgreSQL(②基础命令)
数据库·postgresql