当前位置: 首页 > news >正文

Mysql中有那些锁

按照锁的力度分:

1.行级锁

2.表级锁

3.全局锁

4.页级锁

innodb不支持页锁

全局锁

全局锁指的是对整个数据库实例加锁,一般用于数据库的

表级锁

表锁 是对整张表进行加锁。

表级锁还有以下几种:

意向锁:

意向锁是指,我们在事务请求表/行的意向锁的时候,我们会对整个表加上意向锁。

意向锁解决了一个问题:

就是我们一个事务对行加上锁的时候,另一个事务对表加上锁。这种情况似乎可以发生,但是事务已经对行上锁了,另外的一个事务也可以访问并操作该表内的所有行,这就发生冲突了。

意向共享锁:

多个事务可以同时加上共享锁,但是不能修改

意向排他锁:

表级锁,多个事务可以对该表上面的数据进行修改

AUTO-INC锁

AUTO-INC 锁是一种特殊的表级锁,由插入带有 AUTO_INCREMENT 列的表的事务获取。在最简单的情况下,如果一个事务正在向表中插入值,任何其他事务都必须等待,以便执行它们自己的插入操作,这样第一个事务插入的行就会接收到连续的主键值。

字典锁

字典锁,英文名叫做MetaData Lock,也叫做MDL锁,它是一种用于管理元数据的锁机制,而不是数据本身的锁。

MDL锁用于控制对数据库对象的元数据的并发访问,数据库会在执行DDL(Data Defination Language)操作时加上字典锁。字典锁的主要目的是保护数据库中的元数据对象,如表、列、索引、视图等,以确保在DDL操作期间,不会出现数据一致性问题和竞争条件。

表级排他&共享锁

InnoDB中,一般我们会做的就是两种操作,即DDL和DML。

DML中。我们日常的对数据库表结构的SELECT、INSERT、UPDATE以及DELETE都不会添加表级别的共享锁及排他锁。而是使用默认的并发控制方式——行级锁。

那除了增删改查以外,还有一些其他的操作,比如ALTER、DROP等对表机构改变的动作,他们加锁的过程添加的是MDL锁,即字典锁。

所以,**InnoDB中的表级锁并不是没用,而是因为他划分的太细了,意向锁、AUTO-INC锁、字典锁等。而剩下的普通的排他锁和共享锁,确认很少才能用得上。**我找了很多资料,也没有明确的看到具体是啥时候,在《MySQL是怎样运行的》这本书中提到过一句:比如在崩溃恢复时。

当然,我们可以自己通过SQL语句来添加表级锁。可以使用 LOCK TABLES 手动添加表级锁,但这会阻塞其他所有访问该表的操作,直到执行 UNLOCK TABLES

LOCK TABLES还可以分为排他和共享:

LOCK TABLES table READ:这就是添加表级别的共享锁

LOCK TABLES table WRITE:这就是添加表级别的排他锁

还有就是,Innodb会在倾向于选择行级锁来进行并发控制,但是如果在一些极端情况下, 比如说UPDATE操作需要扫描整个表且对表中许多行进行更新,InnoDB可能会评估行级锁的成本过高,而采用更粗粒度的锁定策略,比如表级锁。然而,这种情况在InnoDB中是非常罕见的,因为InnoDB设计上是倾向于尽可能地使用行级锁。

扩展知识

update时没有用到索引,加什么锁?

相信大家看到过的很多资料中都有过类似的描述“innodb 的 update语句中,如果where条件中没有索引,就不是行级锁了,而是锁表了,就是表级锁”。

我一直也都有这个印象,最开始是从哪看来的,也无从考究了,确实很长一段时间都是这么认为的。但是我发现并不对。

确实,mysql的行级锁锁的是索引,但是当update语句的where条件中没有用到索引的话,他会做全表扫描,但是也不是全部都锁定。而是把符合条件的记录锁住。

锁啥呢?锁主键索引。没有主键呢?会自动创建隐式主键锁住。


以上部分知识来源于网络


文章转载自:

http://sXCk7SVV.qfrmy.cn
http://ztqLmSUn.qfrmy.cn
http://yR2irWac.qfrmy.cn
http://oL6IvszZ.qfrmy.cn
http://Xy6fXSNc.qfrmy.cn
http://WXwNoSLG.qfrmy.cn
http://YUdHcvsV.qfrmy.cn
http://py7cHsAE.qfrmy.cn
http://lz48Bktl.qfrmy.cn
http://V7niIKlp.qfrmy.cn
http://Xn7UnIhE.qfrmy.cn
http://2IizRhEb.qfrmy.cn
http://2LxzqmRN.qfrmy.cn
http://wfuiPtw0.qfrmy.cn
http://c6yQBwSP.qfrmy.cn
http://BK0kWVlJ.qfrmy.cn
http://jeUaF6cA.qfrmy.cn
http://bwXTDYmH.qfrmy.cn
http://l2Jk7oOF.qfrmy.cn
http://M9tufacK.qfrmy.cn
http://vsTb4KUw.qfrmy.cn
http://zh1gY8dL.qfrmy.cn
http://USF5YYaB.qfrmy.cn
http://tclhh8qx.qfrmy.cn
http://QT3spiPb.qfrmy.cn
http://ynAGKeuW.qfrmy.cn
http://tb6eVaaL.qfrmy.cn
http://uyGyjGkw.qfrmy.cn
http://QvtUT31X.qfrmy.cn
http://PpfjXufm.qfrmy.cn
http://www.dtcms.com/a/384111.html

相关文章:

  • React 状态管理(手写实现react-redux)
  • C++:类和对象(下)
  • 智能驾驶再加速:L4 级 AI 系统落地难点与城市试点经验总结
  • 第4章:CPU进阶命令
  • brew@homebrew@linux通用包管理工具linuxbrew
  • NumPy 是 Python 科学计算的基石
  • LLMs之RL之GRPO:《Magistral》的翻译与解读
  • FPGA入门-数码管静态显示
  • 【大模型】企业级应用场景概览
  • uTools 轻工具 简洁又方便
  • Can总线原理
  • Matplotlib 全面详解:从入门到高级应用
  • 爬虫获取API接口的实战指南
  • 裸机开发 时钟配置,EPIT
  • TypeScript项目中,ESLint配置支持子路径的模块导入
  • 机器视觉中的工业相机接口该如何选择?
  • Knockout.js DOM 节点清理模块详解
  • 基于Python的个性化书籍推荐管理系统【2026最新】
  • Java Collection集合框架:体系、核心与选型
  • 最长递减子序列 动态规划
  • C# --- Field and Property
  • 一次 界面无法启动的问题 的解决记录
  • 011=基于YOLO12电动车进电梯检测与警告系统(Python+PySide6界面+训练代码)
  • Antminer S19 Pro 92T矿机详细参数解析与挖矿能力分析
  • LChot100--1143. 最长公共子序列
  • Android开发-选择按钮
  • [温习C/C++]0x06 坐标系中矩形重叠类问题分析
  • 拓扑排序应用——火星词典
  • Afsim沿高程运动
  • PADS查看板子Pins数