MySQL中有哪几种锁?

大家好,我是锋哥。今天分享关于【MySQL中有哪几种锁?】**面试题。**希望对大家有帮助;

MySQL中有哪几种锁?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

在MySQL中,锁的机制用于确保多线程/多用户操作数据库时的数据一致性和完整性。根据锁的粒度、作用范围以及锁的持有方式,MySQL中主要有以下几种锁:

1. 表级锁 (Table-level Locks)

  • 共享锁 (READ LOCK) :允许一个线程读取表中的数据,同时其他线程也可以读取该数据,但不能对其进行修改。一般用于 SELECT 查询。
  • 排它锁 (WRITE LOCK) :一个线程对表进行修改时,其他线程既不能读取也不能修改该表的数据。一般用于 INSERT , UPDATE , DELETE 操作。

表级锁的粒度较大,锁定的是整个表,因此效率较低,但简单的操作和少量并发的场景下表现较好。MySQL的 MyISAM 存储引擎通常使用表级锁。

2. 行级锁 (Row-level Locks)

行级锁是MySQL较细粒度的锁机制,只有对当前行数据的访问才会被锁定,不会影响其他行的数据访问。它通常用于 InnoDB 存储引擎。

  • 共享锁 (S Lock, Shared Lock) :允许一个线程对行进行读取操作,同时其他线程也可以对该行进行读取,但不能进行写入。主要用于 SELECT ... LOCK IN SHARE MODE
  • 排它锁 (X Lock, Exclusive Lock) :允许一个线程对行进行修改操作,同时其他线程既不能对该行进行读取,也不能进行写入。主要用于 SELECT ... FOR UPDATE

行级锁的粒度较小,因此在高并发环境下,行级锁能够提供更高的并发性。

3. 意向锁 (Intention Locks)

意向锁用于表明某个事务打算对某个数据进行某种类型的锁定。意向锁是行级锁的一部分,目的是为了在表级别和行级别的锁之间协调,从而避免死锁。

  • 意向共享锁 (IS, Intention Share Lock):表示事务将对某一行加共享锁。
  • 意向排它锁 (IX, Intention Exclusive Lock):表示事务将对某一行加排它锁。

意向锁是 InnoDB 存储引擎特有的,用于优化锁的管理,避免在表级锁和行级锁之间产生冲突。

4. 自增长锁 (Auto-Increment Locks)

由于MySQL的自增长字段需要一个全局的锁来保证其唯一性和递增顺序,因此MySQL在处理自增操作时会自动加上这种锁。它通常影响的是 AUTO_INCREMENT 字段的值。

5. Gap Lock (间隙锁)

Gap Lock是InnoDB引擎的一种特殊锁,它锁定的是某个值的"间隙",而不是某一行的具体数据。在执行某些查询(如带有 SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE 的查询)时,MySQL会自动使用Gap Lock来避免幻读。

  • 目的是防止多个事务插入相同的值,导致数据的冲突或不一致。

6. Next-Key Lock

Next-Key Lock是InnoDB的组合锁,它结合了行锁和Gap Lock。Next-Key Lock可以锁定一个索引记录和该索引记录的上一个间隙,从而避免幻读现象的发生。

7. 死锁 (Deadlock)

死锁并不是一种锁类型,而是指多个事务在执行时相互持有对方所需的锁,从而无法继续执行的情况。MySQL会自动检测并解决死锁,通过回滚其中一个事务来解开死锁。

总结

MySQL的锁机制可以大致分为:

  • 表级锁:如共享锁、排它锁。
  • 行级锁:如共享锁、排它锁。
  • 意向锁:如意向共享锁、意向排它锁。
  • 自增长锁
  • 间隙锁:用于防止幻读。
  • Next-Key Lock:结合行锁和间隙锁。

不同存储引擎(如InnoDB与MyISAM)使用不同的锁类型,InnoDB通常支持更精细的行级锁,而MyISAM则使用表级锁。在并发环境下,行级锁能提供更高的并发性,而表级锁则可能导致性能瓶颈。

相关推荐
Knight_AL1 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring
倔强的石头_1 小时前
时序数据时代的“存储与分析困局”解析及金仓解决方案
数据库
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
倔强的石头_2 小时前
场景化落地指南——金仓时序数据库在关键行业的应用实践
数据库
SelectDB2 小时前
驾驭 CPU 与编译器:Apache Doris 实现极致性能的底层逻辑
运维·数据库·apache
刀法如飞3 小时前
开箱即用的 DDD(领域驱动设计)工程脚手架,基于 Spring Boot 4.0.1 和 Java 21
java·spring boot·mysql·spring·设计模式·intellij-idea
zbguolei3 小时前
MySQL根据身份证号码计算出生日期和年龄
数据库·mysql
马克学长3 小时前
SSM校园图书借阅服务系统jd2z8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·图书管理系统·ssm 框架·ssm 校园图书借阅系统
软件派3 小时前
高斯数据库使用心得——从性能优化到行业实践的深度解析
数据库·oracle
Chan165 小时前
场景题:CPU 100% 问题怎么排查?
java·数据库·redis·后端·spring