MySQL中有哪几种锁?

news/2025/2/9 5:46:09 标签: mysql, 数据库

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

MySQL中有哪几种锁?

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

在MySQL中,锁的种类主要有以下几种,主要用于控制对数据库资源(如表、行等)的并发访问,确保数据的一致性和完整性。

1. 全局锁(Global Lock)

  • 用途:全局锁作用于整个数据库实例,通常用于执行数据库的备份等操作。
  • 示例FLUSH TABLES WITH READ LOCK,它会锁住所有的表,确保在执行备份时不会有其他事务修改数据。

2. 表锁(Table Lock)

  • 用途:表锁是对整个表加锁,操作时其他事务不能修改该表的数据。表锁比较粗粒度。
  • 类型
    • 共享锁(Read Lock):多个事务可以对同一表加共享锁,但不能修改数据,其他事务只能对该表加共享锁。
    • 排他锁(Write Lock):当一个事务对表加排他锁时,其他事务不能再对该表加任何类型的锁,保证写入操作的独占性。
  • 示例
    • LOCK TABLES table_name READ;(共享锁)
    • LOCK TABLES table_name WRITE;(排他锁)

3. 行锁(Row Lock)

  • 用途:行锁作用于数据表中的具体行,粒度较细,能更好地支持并发访问。适用于InnoDB存储引擎。
  • 类型
    • 共享锁(S Lock):允许事务读取数据,但不允许修改数据。
    • 排他锁(X Lock):对指定的行加排他锁,其他事务不能访问该行。
  • 示例:在SELECT ... FOR UPDATE查询时,会在读取的行上加上行锁。

4. 意向锁(Intention Lock)

  • 用途:意向锁是一种表级锁,用于标识事务打算对某些行加锁(如行锁)。它是为了防止不同事务之间的锁冲突。
  • 类型
    • 意向共享锁(IS):事务意图对某些行加共享锁。
    • 意向排他锁(IX):事务意图对某些行加排他锁。
  • 示例:在InnoDB中,行锁加锁前会先加意向锁,表示该表有行锁的意向。

5. 自定义锁(User-Defined Locks)

  • 用途:用户可以在应用层自定义锁机制,控制事务的并发访问。比如使用GET_LOCK()等函数实现应用层锁。
  • 示例
    • SELECT GET_LOCK('lock_name', timeout);:获取一个自定义名称的锁。
    • SELECT RELEASE_LOCK('lock_name');:释放自定义锁。

6. 死锁(Deadlock)

  • 用途:虽然死锁不是一种明确的锁类型,但它是由于多个事务相互等待对方持有的锁而引发的。死锁会导致事务无法继续执行,需要回滚某个事务来打破死锁。
  • 示例:在多个事务中,事务A持有锁X并等待锁Y,事务B持有锁Y并等待锁X,形成死锁。

7. 事务隔离级别与锁的关系

在MySQL中,锁的行为也受事务的隔离级别影响,常见的事务隔离级别有:

  • 读未提交(Read Uncommitted):允许事务读取未提交的数据,锁的粒度最小。
  • 读已提交(Read Committed):只能读取已提交的数据,锁的粒度较大。
  • 可重复读(Repeatable Read):事务在执行期间读取到的数据在该事务内始终一致,通常会使用行锁。
  • 串行化(Serializable):事务完全串行执行,不允许并发,使用最强的锁。

总结:

  • 全局锁:锁住整个数据库实例。
  • 表锁:锁住整个表。
  • 行锁:锁住特定的行。
  • 意向锁:标示事务对行加锁的意图。
  • 自定义锁:应用层实现的锁。
  • 死锁:多个事务相互等待的死循环状态。

锁是保证数据一致性和并发控制的重要手段,通过不同类型的锁可以根据实际业务场景的需求来平衡性能和数据一致性。


http://www.niftyadmin.cn/n/5845611.html

相关文章

国产编辑器EverEdit - Web预览功能

1 Web预览 1.1 应用场景 在编辑HTML文件时,可以通过EverEdit的Web预览功能,方便用户随时观察和调整HTML代码。 1.2 使用方法 1.2.1 使用EverEdit内部浏览器预览 选择主菜单查看 -> Web预览,或使用快捷键Ctrl B,即可打开Ev…

复原IP地址(力扣93)

有了上一道题分割字符串的基础,这道题理解起来就会容易很多。相同的思想我就不再赘述,在这里我就说明一下此题额外需要注意的点。首先是终止条件如何确定,上一题我们递归到超过字符串长度时,则说明字符串已经分割完毕,…

如果一个服务器突然间变的很卡,该如何排查?

1. 检查资源使用情况 CPU 使用率:使用命令 top 或 htop(Linux 系统)查看 CPU 使用情况。如果 CPU 使用率接近 100%,可能是某个进程消耗了过多的 CPU 资源。 内存使用率:查看内存的使用情况,如果内存接近或超…

mysql8 从C++源码角度看sql生成抽象语法树

MySQL 8的C源码中,SQL语句的词法分析和语法分析是通过一个复杂的解析器实现的,这个解析器将输入的SQL文本转换成抽象语法树(AST)。以下是该过程的主要步骤和相关组件: 主要组件 Lexer (词法分析器): MySQL使用了一个称…

C++ 23 的栈踪迹库(stacktrace)

1 Boost.Stacktrace ​ 当程序发生错误的时候,能提供的信息越多,对错误的定位就越有利。C#、Pyrhon、Java 等编程语言都提供调用栈踪迹回溯的功能,在错误发生的时候,除了报告错误发生的位置,还能输出函数调用栈信息。…

大模型推理——MLA实现方案

1.整体流程 先上一张图来整体理解下MLA的计算过程 2.实现代码 import math import torch import torch.nn as nn# rms归一化 class RMSNorm(nn.Module):""""""def __init__(self, hidden_size, eps1e-6):super().__init__()self.weight nn.Pa…

Qt实现简易视频播放器

使用Qt6实现简易音乐播放器,效果如下: github: Gabriel-gxb/VideoPlayer: qt6实现简易视频播放器 一、整体架构 该代码整体架构围绕着MainWindow类构建一个媒体播放器相关的应用程序。 主要组件 (一)界面组件&…

携手AWS,零成本在EKS上体验AutoMQ企业版

01 前言 AutoMQ是一款贯彻云优先理念来设计的 Kafka 替代产品。AutoMQ 创新地对 Apache Kafka 的存储层进行了基于云的重新设计,在 100% 兼容 Kafka 的基础上通过将持久性分离至 EBS 和 S3 带来了 10x 的成本降低以及 100x 的弹性能力提升,并且相比 Apa…