MySQL-锁

数据库中锁的分类:

根据锁的颗粒度不同,MySQL的锁可以分为全局锁,表级锁,行级锁。

在对一张表结构进行修改的时候,MySQL就会对这张表加一个元数据锁,这个元数据锁就是属于表级锁。

行级锁目前只有Innodb存储引擎实现了,MyISAM存储引擎是不支持行级锁的,只有表锁。Innodb存储引擎实现的行级锁主要有记录锁,间隙锁,临键锁,插入意向锁这些,当我们对记录进行select for update,或者增删改的时候,就会对记录加上行级锁。

全局锁:

主要应用于全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

表级锁:

  • 表锁:通过lock tables语句可以对表加表锁,表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。
  • 元数据锁:当我们对数据库表进行操作的时候,会自动给这个表加上MDL,对一张表进行CRUD操作时,加的是MDL读锁;对一张表做结构变更操作的时候,加的是MDL写锁;MDL时为了保证用户对表执行CRUD操作时,防止其他线程对这个表结构做了变更。
  • 意向锁:当执行插入、更新、删除操作,需要先对表加上【意向独占锁】,然后对记录加上独占锁。意向锁的目的是为了快速判断表的是否有记录被加锁。

行级锁:

Innodb实现的行级锁由记录锁、间隙锁、临键锁、插入意向锁。我们在使用增删改或者锁定都语句的时候,都会对记录加上行级锁。

  • 记录锁,可以避免其他事务对该记录进行删除或者更新操作。
  • 间隙锁,可以避免其他事物往间隙里插入新记录。
  • 临键锁,是记录锁与间隙锁的组合,所以它就可以免其他事物对该记录进行删除和更新操作,也可以避免其他事物往间隙里插入新记录。
  • 插入意向锁:插入意向锁和间隙锁是互斥的关系,其他事物插入的时候,发现插入位置的下一条记录由间隙锁的话,才会生成插入意向锁,并且这个时候锁的状态是阻塞状态,目的是告诉用户插入的位置存在间隙锁。

问题:

一条update语句没有加where条件加的是什么锁?

可重复读级别下,更新没有带where条件,会全表扫描,会对每一条记录加上next-key锁,相当于锁住了全表

读已提交级别下,没有间隙锁,更新没有带where条件,是全表扫描,那么灰度每一条记录都加上记录锁。

实现乐观锁的方式:

  • 版本号机制:在表中增加一个版本号字段,每次更新的时候,版本号就+1。在更新数据前,先读取数据的版本号,在更新时将版本号作为条件进行判断,如果版本号与之前读取的一致,就更新数据并将版本号加1;如果不一致,说明数据已经被其他事务进行了修改,更新失败。
  • 时间戳机制:与版本号机制类似,只是使用时间戳来记录数据的修改时间。
相关推荐
风哥2号1 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
YangYang9YangYan2 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
西安栈上月明软件科技3 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m3 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
风哥2号5 小时前
数据库教程FGMT43‑MySQL性能分析与优化调整
数据库·mysql
随身数智备忘录6 小时前
财务数据分析如何与业务场景结合?财务数据分析如何从数出有据到数出有用?
数据库
这个DBA有点耶7 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea7 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
默 语8 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
probex_8 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库