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.mzph.cn/pingmian/61116.shtml

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

相关文章

WordPress设置自动更新CSS版本号

WordPress 通常会在引用 CSS 文件时添加版本号参数(?verx.x.x)。如果版本号未更新,浏览器可能继续加载旧的文件。 解决方法:确保你在 functions.php 文件中正确加载了 CSS 文件,并动态更新版本号。例如在functions.p…

若依权限控制

springbootvue2项目中的权限控制(若依项目) 步骤: 1.登录管理员账号,为普通用户增加权限按钮 绿色部分为权限控制字符 2.在后端对应的方法上增加权限控制(这里以删除操作为例):PreAuthorize(“ss.hasPermi(‘area:store:remove’)”) 3.在前端对应的按钮上增加权限控制:v-ha…

【机器学习】如何配置anaconda环境(无脑版)

马上就要上机器学习的实验,这里想写一下我配置机器学习的anaconda环境的二三事 一、首先,下载安装包: Download Now | Anaconda 二、打开安装包,一直点NEXT进行安装 这里要记住你要下载安装的路径在哪,后续配置环境…

OceanBase 升级过程研究(4.2.1.6-4.2.1.8)

模拟业务 使用benchmark加载10仓数据模拟业务场景 升级方法 使用滚动升级方式来进行OB升级。该方法前提是OB集群必须满足官方规定的高可用架构(如果 Zone 个数小于 3,滚动升级时则无法构成多数派), 滚动升级的原理就是轮流完成每个ZONE的升级工作,由于…

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…

C#.Net筑基-字符串超全总结

字符串是日常编码中最常用的引用类型了,可能没有之一,加上字符串的不可变性、驻留性,很容易产生性能问题,因此必须全面了解一下。 01、字符与字符编码 1.1、字符Char 字符 char 表示为 Unicode字符,在C#中用 UTF-16 …

苍穹外卖-后端部分

软件开发整体介绍 前端搭建 在非中文目录中双击nginx.exe然后浏览器访问localhost即可 后端搭建 基础准备 导入初始文件 使用git进行版本控制 创建本地仓库和远程仓库,提交Git 连接数据库 连接数据库把资料中的文件放入运行即可 前后端联调测试 苍穹外卖项目接口文档…

剧本杀门店预约小程序,解锁沉浸式推理体验

一、开发背景 剧本杀作为一种热门娱乐游戏,深受大众的欢迎,但随着市场的快速发展,竞争也在不断加大,对于剧本杀线下商家来说面临着发展创新。 剧本杀线下门店数量目前正在逐渐增加,竞争激烈,而门店的获客…

【WPF】Prism学习(二)

Prism Commands 1.命令(Commanding) 1.1. ViewModel的作用: ViewModel不仅提供在视图中显示或编辑的数据,还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面(UI)执行的动作或操作…

学者观察 | 元计算、人工智能和Web 3.0——山东大学教授成秀珍

导语 成秀珍教授提出元计算是在开放的零信任环境下整合算力资源打通数据壁垒构建自进化智能的新质生产力技术,是一种新计算范式;区块链是Web3.0的核心技术之一,有助于保障开放零信任环境下,用户、设备和服务间去中心化数据流通的…

学习笔记022——Ubuntu 安装 MySQL8.0版本踩坑记录

目录 1、查看可安装 MySQL 版本 2、Ubuntu安装 MySQL8.0 3、MySQL8.0 区分大小写问题 4、MySQL8.0 设置sql_mode 5、MySQL8.0 改端口33060(个人遇到问题) 1、查看可安装 MySQL 版本 ## 列出可用的MySQL版本(列出所有可用的MySQL版本以…

「AI Infra 软件开源不是一个选项,而是必然」丨云边端架构和 AI Infra专场回顾@RTE2024

在人工智能和开源技术蓬勃发展的当下,AI Infra 项目正经历着日新月异的变革。从跨平台运行时到云边端 AI 基础设施,再到多模态知识助手,创新浪潮席卷而来。这些进步不仅显著提升了技术指标,也为实时音视频处理、边缘计算、大模型应…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果: – 使用Pygame模拟粒子运动,粒子会以爱心的轨迹分布并运动。爱心公式: 爱心的数学公式: x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果: 粒子…

免费实时图片编辑工具:MagicQuill

参看: https://huggingface.co/spaces/AI4Editing/MagicQuill 人工智能交互式图像编辑:可以制定涂改增加删除

web——upload-labs——第九关——特殊字符::$DATA绕过

特殊字符::$DATA绕过 典型绕过场景 在一些系统中,::$DATA 被用于绕过文件路径的限制。比如: 路径过滤绕过:如果系统有某种机制来检查和限制文件路径(例如,禁止访问某些系统目录或敏感文件),通…

本地部署 excalidraw

本地部署 excalidraw 0. 引言1. 本地部署 excalidraw2. 访问 excalidraw 0. 引言 Excalidraw 编辑器是一款开源虚拟手绘白板,支持协作且端到端加密。 1. 本地部署 excalidraw git clone https://github.com/excalidraw/excalidraw.git; cd excalidrawvi docker-c…

《Java核心技术 卷I》用户界面AWT事件继承层次

AWT事件继承层次 EventObject类有一个子类AWTEvent,它是所有AWT事件类的父类。 Swing组件会生成更多其他事件对象,都直接拓展自EventObject而不是AWTEvent。 AWT将事件分为底层(low-level)事件和语义事件。 语义事件:表示用户的动作事件&…

三周精通FastAPI:42 手动运行服务器 - Uvicorn Gunicorn with Uvicorn

官方文档:Server Workers - Gunicorn with Uvicorn - FastAPI 使用 fastapi 运行命令 可以直接使用fastapi run命令来启动FastAPI应用: fastapi run main.py如创建openapi.py文件: from fastapi import FastAPIapp FastAPI(openapi_url&…

整理iPhone空间:iphone怎么删除相簿

随着时间的积累,我们的iPhone中不仅会堆积大量照片,还可能会有多个不再需要的相簿。这些相簿不仅占用存储空间,还可能使相册应用变得杂乱无章。本文将探讨iphone怎么删除相簿,并介绍精简iPhone相册的技巧,使你的相册管…

路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受

文章目录 1.仓库位置2.新建仓库3.配置仓库4.克隆和上传5.推荐文章和我的感受 1.仓库位置 这个仓库的位置就是在我们的这个个人主页的右上角;如果是第一次注册账号的话,这个主页里面肯定是不存在仓库的,需要我们自己手动的进行创建&#xff1…