MySQL 的锁,表级锁是哪一层的锁?行锁是哪一层的锁?

MySQL 的锁层级与类型

在 MySQL 中,锁的层级和实现与存储引擎密切相关。


1. 表级锁(Table-Level Locks)

(1)存储引擎层的表级锁
  • 实现层级存储引擎层(如 MyISAM、InnoDB)。
  • 特点
    • 粒度粗:锁定整张表,并发性能较低。
    • 适用场景:适合读多写少或全表操作(如 MyISAM 引擎的读/写锁)。
  • 示例
    • MyISAM 的表锁
      MyISAM 默认使用表级锁,分为 共享读锁(S锁)排他写锁(X锁)
      例如,执行 SELECT 时加读锁,INSERT/UPDATE 时加写锁。
    • InnoDB 的表锁
      InnoDB 在特定场景(如未命中索引的全表扫描)可能升级行锁为表级锁。
(2)Server 层的表级锁(元数据锁,MDL)
  • 实现层级Server 层
  • 特点
    • 隐式管理:由 MySQL Server 自动加锁,用于保护表结构(DDL 操作)。
    • 锁冲突:DML(如 SELECT/INSERT)与 DDL(如 ALTER TABLE)会触发 MDL 锁冲突。
  • 示例
    执行 ALTER TABLE 时,MySQL Server 会加 MDL 写锁,阻塞其他会话的 DML 操作。

2. 行级锁(Row-Level Locks)

实现层级存储引擎层(仅 InnoDB 支持)。
  • 特点
    • 粒度细:仅锁定需要操作的行,并发性能高。
    • 支持事务:通过 MVCC(多版本并发控制)实现非锁定读。
  • 锁类型
    • 共享锁(S 锁):允许其他事务读,但禁止写。
    • 排他锁(X 锁):禁止其他事务读或写。
    • 间隙锁(Gap Lock):锁定索引记录间的间隙,防止幻读。
  • 示例
    执行 SELECT ... FOR UPDATE 时,InnoDB 会对符合条件的行加排他锁。

3. 对比表级锁与行级锁

特性表级锁行级锁
粒度锁定整张表锁定单行或多行
并发性能低(锁冲突概率高)高(锁冲突概率低)
存储引擎MyISAM(默认)、InnoDB(特殊情况)InnoDB(默认支持)
适用场景全表操作、读多写少高并发写、事务隔离(如 RC/RR 级别)
实现层级存储引擎层(MyISAM/InnoDB) + Server 层(MDL)存储引擎层(仅 InnoDB)

4. 关键注意事项

  1. InnoDB 的锁升级

    • 当行锁数量过多或未命中索引时,InnoDB 可能将行锁升级为表级锁。
    • 示例:UPDATE table SET col=1 WHERE unindexed_col=10(全表扫描触发表锁)。
  2. 死锁风险

    • 行级锁可能引发死锁(如事务 A 锁行 1,事务 B 锁行 2,互相等待)。
    • InnoDB 会自动检测死锁并回滚代价较小的事务。
  3. 显式锁与隐式锁

    • 显式锁:通过 LOCK TABLESSELECT ... FOR UPDATE 手动加锁。
    • 隐式锁:由存储引擎自动管理(如 DML 语句触发的行锁)。

5. 总结

  • 表级锁
    • 存储引擎层:MyISAM 默认使用,InnoDB 在特殊场景下触发。
    • Server 层:元数据锁(MDL)保护表结构。
  • 行级锁
    • 仅 InnoDB 支持,通过 MVCC 和锁机制实现高并发事务。
    • 默认细粒度锁,避免全表锁定。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里巴巴按图搜索1688商品(拍立淘) API 返回值说明

阿里巴巴按图搜索1688商品(拍立淘)API 返回值说明 阿里巴巴按图搜索1688商品(拍立淘)API 的返回值通常以 JSON 格式返回,包含搜索结果、商品信息、分页信息等。以下是具体的返回值说明: 1. 请求状态信息 …

基于esp32-s3,写一个实现json键值对数据创建和读写解析c例程

以下是一个基于 ESP32 - S3 使用 ESP - IDF 框架实现 JSON 键值对数据创建、读写和解析的 C 语言例程。 环境准备 确保你已经安装了 ESP - IDF 开发环境&#xff0c;并且可以正常编译和烧录代码到 ESP32 - S3 开发板。 代码示例 #include <stdio.h> #include <stri…

MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?

MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一&#xff0c;它允许我们在开发时以面向对象的方式构建 SQL 的 WHERE 条件、ORDER BY、SELECT 字段列表等部分。与传统的 MyBatis 在 XML 文件中…

STM32与i.MX6ULL内存与存储机制全解析:从微控制器到应用处理器的设计差异

最近做FreeRTos&#xff0c;以及前面设计的RVOS&#xff0c;这种RTOS级别的系统内存上的分布与CortexA系列里面的分布有相当大的区别&#xff0c;给我搞糊涂了。 目录 STM32&#xff08;Cortex-M系列&#xff09;的内存与存储机制 Flash存储内容RAM存储内容启动与运行时流程示例…

Eteam 0.3版本开发规划

Eteam 0.1系列经历了3个小版本&#xff0c;主要完成了团队资料库功能。 Eteam 0.2系列经历了22个小版本&#xff0c;主要完成了白板和AI交互的能力。 目前的问题 目前白板上的数据有两个来源&#xff0c;团队资料库和外部数据。外部数据和团队资料库数据边界不是很清晰。 0.3版…

HTML5好看的水果蔬菜在线商城网站源码系列模板5

文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#…

深入理解Java包装类:自动装箱拆箱与缓存池机制

深入理解Java包装类&#xff1a;自动装箱拆箱与缓存池机制 对象包装器 Java中的数据类型可以分为两类&#xff1a;基本类型和引用类型。作为一门面向对象编程语言&#xff0c; 一切皆对象是Java语言的设计理念之一。但基本类型不是对象&#xff0c;无法直接参与面向对象操作&…

uniapp自定义拖拽排列

uniapp自定义拖拽排列并改变下标 <!-- 页面模板 --> <template><view class"container"><view v-for"(item, index) in list" :key"item.id" class"drag-item" :style"{transform: translate(${activeInde…

基于SpringBoot的课程管理系统

前言 今天给大家分享一个基于SpringBoot的课程管理系统。 1 系统介绍 课程管理系统是一种专门为学校设计的软件系统&#xff0c;旨在帮助学校高效地管理和组织各类课程信息。 该系统通常包括学生、教师和管理员三大角色。 他们可以通过系统进行选课、查看课程表、考试、进…

max31865典型电路

PT100读取有很多种方案&#xff0c;常用的惠斯通电桥&#xff0c;和专用IC max31865 。 电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD&#xff0c;镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围&#x…

飞算 JavaAI 与 Spring Boot:如何实现微服务开发效率翻倍?

微服务架构凭借其高内聚、低耦合的特性&#xff0c;成为企业构建复杂应用系统的首选方案。然而&#xff0c;传统微服务开发流程中&#xff0c;从服务拆分、接口设计到代码编写、调试部署&#xff0c;往往需要耗费大量时间与人力成本。Spring Boot 作为 Java 领域最受欢迎的微服…

(2)Docker 常用命令

文章目录 Docker 服务器Docker 镜像Docker 容器本地 RegistryRUN vs CMD vs ENTRYPOINTRUNCMDENTRYPOINT 限制容器对内存、CPU 和 IO 资源的使用内存CPUBlock IO设置权重bps 和 iops cgroup 和 namespacecgroupnamespacMount namespaceUTS namespaceIPC namespacePID namespace…

Django 实现电影推荐系统:从搭建到功能完善(附源码)

前言&#xff1a;本文将详细介绍如何使用 Django 构建一个电影推荐系统&#xff0c;涵盖项目的搭建、数据库设计、视图函数编写、模板渲染以及用户认证等多个方面。&#x1f517;软件安装、环境准备 ❤ 【作者主页—&#x1f4da;阅读更多优质文章、获取更多优质源码】 目录 一…

C#进阶学习(七)常见的泛型数据结构类(2)HashSet和SortedSet

目录 using System.Collections.Generic; // 核心命名空间 一、 HashSet 核心特性 常用方法 属性 二、SortedSet 核心特性 1、整型&#xff08;int、long 等&#xff09; 2、字符串型&#xff08;string&#xff09; 3、字符型&#xff08;char&#xff09; 4、自定义…

SQL之DML(查询语句:select、where)

&#x1f3af; 本文专栏&#xff1a;MySQL深入浅出 &#x1f680; 作者主页&#xff1a;小度爱学习 select查询语句 在开发中&#xff0c;查询语句是使用最多&#xff0c;也是CRUD中&#xff0c;复杂度最高的sql语句。 查询的语法结构 select *|字段1 [, 字段2 ……] from 表…

vue | 不同 vue 版本对复杂泛型的支持情况 · vue3.2 VS vue3.5

省流总结&#xff1a;defineProps 的泛型能力&#xff0c;来直接推导第三方组件的 props 类型 引入第三方库的类型&#xff0c;并直接在 <script setup> 中作为 props 使用。这种类型一般是复杂泛型&#xff08;包含联合类型、可选属性、交叉类型、条件类型等&#xff0…

Unity-无限滚动列表实现Timer时间管理实现

今天我们来做一个UI里经常做的东西&#xff1a;无限滚动列表。 首先我们得写清楚实现的基本思路&#xff1a; 所谓的无限滚动当然不是真的无限滚动&#xff0c;我们只要把离开列表的框再丢到列表的后面就行&#xff0c;核心理念和对象池是类似的。 我们来一点一点实现&#x…

Docker的基本概念和一些运用场景

Docker 是一种开源的容器化平台&#xff0c;可以帮助开发人员更加高效地打包、发布和运行应用程序。以下是 Docker 的基本概念和优势&#xff1a; 基本概念&#xff1a; 容器&#xff1a;Docker 使用容器来打包应用程序及其依赖项&#xff0c;容器是一个独立且可移植的运行环境…

Unity中基于第三方插件扩展的对于文件流处理的工具脚本

在Unity的项目中对应文件处理,在很多地方用到,常见的功能,就是保存文件,加载文件,判断文件或者文件夹是否存在,删除文件等。 在之前已经写过通过C#的IO实现的这些功能,可查看《Unity C# 使用IO流对文件的常用操作》,但是不能保证所有平台都可以使用 现在基于第三方跨…

Flink介绍——实时计算核心论文之MillWheel论文详解

引入 通过前面的文章&#xff0c;我们从S4到Storm&#xff0c;再到Storm结合Kafka成为当时的实时处理最佳实践&#xff1a; S4论文详解S4论文总结Storm论文详解Storm论文总结Kafka论文详解Kafka论文总结 然而KafkaStorm的第一代流式数据处理组合&#xff0c;还面临的三个核心…