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

MySQL 中有哪几种锁?

在 MySQL 中,锁(Locks)是为了保证数据的一致性和完整性而设计的机制。常见的锁可以从粒度操作类型两个角度分类。以下是详细介绍:


粒度 分类

1. 全局锁
  • 描述:锁定整个数据库实例。
  • 用途:主要用于备份,如 FLUSH TABLES WITH READ LOCK (FTWRL)
  • 特点
    • 整个数据库处于只读状态。
    • 对性能影响较大,通常不建议在线使用。
2. 表级锁
  • 描述:锁定整个表,防止其他线程对表进行操作。
  • 类型
    • 表锁:使用 LOCK TABLES 语句显式加锁。
    • 元数据锁(MDL, Metadata Lock)
      • 自动加锁,例如 ALTER TABLE 时。
      • 防止表结构在读写操作时被修改。
  • 特点
    • 并发性较低,因为锁住了整个表。
3. 行级锁
  • 描述:对特定行记录加锁,主要由 InnoDB 引擎支持。
  • 优点:粒度最小,并发性能高。
  • 实现方式
    • 基于索引加锁。如果没有索引,行锁会退化为表锁。
  • 适用场景:高并发环境。

操作类型 分类

1. 共享锁(S 锁,Shared Lock)
  • 描述:允许多个事务同时读取,但禁止写入。
  • 使用方式:通过 SELECT ... LOCK IN SHARE MODE 显式加锁。
  • 适用场景
    • 需要读取数据并防止数据被其他事务修改时。
    • 例如检查数据后基于条件执行写操作。
2. 排他锁(X 锁,Exclusive Lock)
  • 描述:一个事务持有排他锁后,其他事务不能再读取或修改该记录。
  • 使用方式:通过 FOR UPDATE 显式加锁,或隐式加锁(如 INSERTUPDATE)。
  • 适用场景
    • 修改数据时确保线程安全。

意图 分类(InnoDB 专属)

为了提高加锁效率,InnoDB 提供了意向锁(Intent Locks),与表锁结合使用:

  • 意向共享锁(IS 锁):事务准备在某行加共享锁前先获取表的 IS 锁。
  • 意向排他锁(IX 锁):事务准备在某行加排他锁前先获取表的 IX 锁。
  • 作用:快速判断是否能对整张表加锁,避免扫描整表。

其他特殊锁

1. 间隙锁(Gap Lock)
  • 描述:锁住索引间隙,而不是具体的行。
  • 用途:防止幻读问题,保证事务的可重复读(REPEATABLE READ)。
  • 场景:例如在范围查询中,锁住范围内不存在的记录。
2. 临键锁(Next-Key Lock)
  • 描述:行锁 + 间隙锁的组合。
  • 用途:解决可重复读(REPEATABLE READ)隔离级别下的幻读问题。
3. 自增锁(AUTO-INC Lock)
  • 描述:对含有自增列的表加特殊锁,保证自增列的生成顺序。
  • 特点:独占锁,直到当前事务完成。
4. 死锁检测锁
  • 描述:通过检测锁的相互等待关系来判断是否存在死锁。

总结

  • 全局锁:适用于全局操作,如备份。
  • 表级锁:适用于表的结构变更或全表操作。
  • 行级锁:适用于高并发写入。
  • 间隙锁和临键锁:解决幻读问题。
  • 意向锁:优化加锁性能。

在实际开发中,应根据场景选择适当的锁类型,以平衡数据一致性和并发性能。


http://www.kler.cn/a/399851.html

相关文章:

  • Macmini中普通鼠标与TrackPad联动问题解决
  • Ubuntu 22.04.4 LTS + certbot 做自动续签SSL证书(2024-11-14亲测)
  • STL序列式容器之list
  • JsonCpp
  • 7.揭秘C语言输入输出内幕:printf与scanf的深度剖析
  • Element-ui Select选择器自定义搜索方法
  • 【Mysql】函数--日期函数(上)
  • hive复杂数据类型Array Map Struct 炸裂函数explode
  • day-17 反转字符串中的单词
  • 【FacePoke人像表情调整】如何在本地和远程使用FacePoke进行AI人像表情调整
  • 后端-Result.java工具类和SystemCode.java工具类
  • 5. ARM_指令集
  • 如何手写实现 JSON Parser
  • 自己动手写Qt Creator插件
  • 电脑插入U盘, 电脑显示新增了,但是双击却显示 请将磁盘插入
  • 如何在 gdb 中执行命令
  • css 使用图片作为元素边框
  • shell脚本命令1,保姆级别---清风
  • 【jvm】G1垃圾收集器的特点,为什么低延迟
  • 组成字符串ku的最大次数(字节青训)
  • 农村生活污水排水监测系统:助力乡村生态环境建设
  • 北斗授时板卡 北斗双模PCI总线授时板卡优势分析 双模PCI授时板卡
  • ArchGuard 架构分析器发布:多语言、跨项目架构数据生成,助力 AI 时代知识挖掘...
  • CSS3_伸缩盒模型(十)
  • java.lang.NoSuchMethodError: org.flowable.bpmn.model.FlowNode.isAsynchronous
  • window的wsl(Ubuntu)安装kafka步骤