MySQL 的锁机制是其并发控制的核心,直接影响数据库的性能、一致性与可用性。本文将从底层原理、锁的分类、实现机制、锁的粒度、锁的兼容性、死锁处理、InnoDB 的行锁实现、MVCC 与锁的关系等多个维度,进行硬核、深度解析,适用于希望深入理解 MySQL 并发控制机制的开发者与 DBA。


一、MySQL 锁机制概览

MySQL 的锁机制主要由存储引擎层实现,不同引擎的锁策略不同:

  • MyISAM:仅支持表级锁(Table-level Locks)
  • InnoDB:支持行级锁(Row-level Locks)、表级锁、意向锁、间隙锁、临键锁等,是目前最复杂的锁系统

我们以 InnoDB 为主进行深度剖析。


二、InnoDB 锁的类型与分类

1. 按粒度划分

锁类型 粒度 说明
表级锁 Table Lock 锁整张表,开销小,但并发低
行级锁 Row Lock 锁具体行,高并发,开销大
页级锁 Page Lock 锁一页(如 16KB),介于表与行之间(BDB 支持,InnoDB 不用)

InnoDB 实现的是逻辑行级锁,物理上通过索引项加锁实现。


2. 按模式划分(共享锁 vs 排他锁)

锁类型 别名 SQL 语法 兼容性
共享锁(S Lock) 读锁 SELECT ... LOCK IN SHARE MODE 多个 S 锁可共存
排他锁(X Lock) 写锁 SELECT ... FOR UPDATEUPDATE/DELETE 仅一个 X 锁,不与 S/X 兼容
兼容性矩阵:
请求 \ 持有 S(共享) X(排他)
S ✅ 兼容 ❌ 不兼容
X ❌ 不兼容 ❌ 不兼容

3. 意向锁(Intention Locks)

目的:提高表级锁与行级锁的兼容性检测效率。

  • IX(Intention Exclusive):事务打算在某些行上加 X 锁
  • IS(Intention Shared):事务打算在某些行上加 S 锁
意向锁的规则:
  • 意向锁是表级锁,但表示的是对行加锁的“意图”
  • 意向锁之间完全兼容(IS 与 IX 可共存)
  • 真正的冲突发生在行锁之间
示例:
-- 事务 T1
BEGIN;
SELECT * FROM t WHERE id = 1 FOR UPDATE;  -- 加 IX + 行 X 锁

此时其他事务若想对整表加 X 锁(如 LOCK TABLES t WRITE),会检测到 IX,拒绝加锁。


4. 行锁的实现方式:记录锁(Record Lock)

  • 锁住索引上的单个记录
  • 如果表没有主键,InnoDB 会隐式创建一个 6 字节的 ROWID 作为聚簇索引,行锁基于此
-- 假设 id 是主键
SELECT * FROM t 

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

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

相关文章

7.软件工程

软件生命周期软件生命周期什么是软件工程?以工程化的原则和方法来开发软件,其目的是提高软件生产率、提高软件质量、降低软件成本。软件工程3大组成部分:方法、工具、过程。什么是软件生命周期:经过开发、使用和维护,直…

C 语言结构体与 Java 类的异同点深度解析

在编程语言的发展历程中,C 语言的结构体与 Java 的类扮演着至关重要的角色。作为面向过程编程的经典代表,C 语言的结构体为数据封装提供了基础形式;而 Java 作为纯面向对象语言,类则是其核心语法结构。二者既存在一脉相承的设计思想,又因编程语言范式的差异呈现出显著区别…

C++、STL面试题总结(二)

1. 必须实现拷贝构造函数的场景 核心问题:默认拷贝构造的缺陷 C 默认的拷贝构造函数(浅拷贝),会直接拷贝指针 / 引用成员的地址。若类包含引用成员或指向堆内存的指针,浅拷贝会导致 “多个对象共享同一份资源”&…

IntelliJ IDEA2024 错误‘http://start.spring.io/‘的初始化失败,请检查URL、网络和代理设置。

下载新版本的intellij idea2024创建项目时,服务器URL报错误http://start.spring.io/的初始化失败,请检查URL、网络和代理设置。错误消息:Cannot download http://start.spring.io/:Permission denied:getsockopt,具体如下图&#…

从零开始的云计算生活——第三十八天,避坑落井,Docker容器模块

一.故事背景 在综合使用了之前全部的知识完成项目之后,接下来将学习更简单的方法来对之前的命令进行使用,马上进入容器模块 二. Docker概述 Docker简介 Docker,翻译过来就是码头工人 Docker是一个开源的应用容器引擎,让开发者…

Python与自动化运维:构建智能IT基础设施的终极方案

Python与自动化运维:构建智能IT基础设施的终极方案 引言:运维革命的Python引擎 在DevOps理念席卷全球的今天,企业IT基础设施的复杂度呈指数级增长。某跨国银行的数据显示,采用Python构建的自动化运维体系使其服务器部署效率提升400%,故障响应时间缩短至原来的1/8。本文将…

HarmonyOS应用开发环境搭建以及快速入门介绍

下载并安装DevEco Studio,这是华为官方提供的HarmonyOS应用开发IDE。访问华为开发者联盟官网下载对应操作系统的版本。安装完成后,配置HarmonyOS SDK和必要的工具链。 确保计算机满足开发环境要求,包括Windows 10 64位或macOS 10.14及以上操…

RocketMQ与Kafka 消费者组的‌重平衡操作消息顺序性对比

RocketMQ 的重平衡机制本身不会直接影响消息顺序,但消费模式的选择和使用需注意以下细节:重平衡机制RocketMQ消费者组的重平衡策略是每隔20秒从Broker获取消费组的最新消费进度,并根据订阅信息重新分配消息队列。该策略主要影响消息拉取的均衡…

学习 Android(十四)NDK基础

学习 Android(十四)NDK基础 Android NDK 是一个工具集,可让我们使用 C 和 C 等语言以原生代码实现应用的各个部分。对于特定类型的应用,这可以帮助我们重复使用以这些语言编写的代码库。 接下来,我们将按照以下步骤进行…

宝塔(免费版9.2.0)的docker拉取仓库失败的加速方法

宝塔docker拉取仓库失败 完美加速方法_宝塔docker加速-CSDN博客 版本:免费版 9.2.0 https://docker.1ms.run 其他的试了很多 都不行 最后不要用宝塔的控制面板(很卡),直接在linux中用命令行,效果就很好了。

文献解读-生境分析亚区域选择+2D_DL+3D_DL-局部晚期食管鳞状细胞癌新辅助化疗免疫治疗反应预测

研究标题:结合亚区域放射组学与多通道二维或三维深度学习模型预测局部晚期食管鳞状细胞癌(LA-ESCC)患者对新辅助化疗免疫治疗(NACI)的反应借鉴点:建模思路(看流程图理解就够了)引言食…

机器学习第四课之决策树

目录 简介 一.决策树算法简介 二. 决策树分类原理 1.ID3算法 1.1 熵值 1.2 信息增益 1.3 案例分析 ​编辑 2.C4.5 2.1 信息增益率 2.2.案例分析 3.CART决策树 3.1基尼值和基尼指数 3.2案例分析 三、决策树剪枝 四、决策树API 五、电信客户流失 六、回归树 七. 回归…

Java面试题和答案大全

一、Java基础知识 1. Java语言特点 题目: 请说明Java语言的主要特点? 答案: 面向对象:Java是纯面向对象的语言,支持封装、继承、多态 平台无关性:一次编译,到处运行(Write Once, Run Anywhere) 简单性:语法简洁,去掉了C++中的指针、多重继承等复杂特性 安全性:提…

用NAS如何远程访问:详细教程与实用技巧

在信息时代,家用NAS(网络附加存储)成为家庭数据存储和管理的热门设备。它不仅可以作为家庭照片、视频、工作文件的集中存储中心,还支持远程访问,方便用户随时随地获取数据。那么,如何配置和实现家用NAS的远…

Qt-桌面宠物

目录 一,演示(部分功能) 二,开发环境准备 三,部分代码实现 1.创建基础窗口 2.实现宠物动画 3.添加交互功能 4.系统托盘集成 5.行为模式实现 6.状态管理系统 7.资源打包部署 四,接受定制 一&…

C++编程学习(第19天)

局部变量和全局变量每一个变量都有其有效作用范围,这就是变量的作用域,在作用域以外是不能访问这些变量的。局部变量在一个函数内部定义的变量是局部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用他们,…

客流特征识别准确率提升 29%:陌讯多模态融合算法在零售场景的实战解析

原创声明本文为原创技术解析文章,涉及的技术参数与架构设计引用自《陌讯技术白皮书》,禁止任何形式的抄袭与转载。一、行业痛点:零售客流识别的技术瓶颈在零售数字化转型过程中,客流特征识别(包括性别、年龄分层、停留…

YOLOv8/YOLOv11 C++ OpenCV DNN推理

首先需要将yolov8/yolov11的pt文件转为onnx文件 from ultralytics import YOLO model YOLO("best.pt") model.export(format"onnx",opset11,dynamicFalse) 本次C工具使用vs2017,需要下载OpenCV包:https://opencv.org/releases/&a…

【Mysql】日志--错误日志、二进制日志、查询日志、慢查询日志

错误日志:数据库出现错误时,进行故障排除默认位置:/var/log/mysqld.log查看日志位置show variables like %log_error%查看日志tail -50 /var/log/mysqld.log二进制日志:记录了所有的DDL语句和DML语句,不包含查询(selec…

后端常用框架环境与软件详解

一、基础运行环境 1. JDK(Java Development Kit) 定义:Java 开发工具包,包含编译器、运行时环境(JRE)及核心类库 作用:提供 Java 程序开发和运行的基础环境,是所有 Java 应用的必备依…