MySql什么时候表锁or行锁?
文章目录
- 锁的基本概念
- 共享锁(读锁)
- 排他锁(写锁)
- 锁的兼容性
- 锁的升级和降级
- 全局锁、表锁、行锁
- 全局锁
- 表锁
- 行锁
- 何时使用行锁
- 何时使用表锁
- 额外思考:
在数据库的世界里,性能优化是一个永恒的话题。MySQL作为广泛使用的数据库之一,其锁机制是保证数据一致性的关键。了解何时使用行锁和表锁,能够帮助我们更有效地进行数据库操作,避免死锁和性能瓶颈。
众所周知,我们都知道 Innodb 有全局锁、表级锁、行级锁三种,但你知道什么时候会用表锁,什么时候会用行锁吗?
- 对于表级锁而言,当执行 DDL 语句去修改表结构时,会使用表级锁
- 对于行级锁而言,一般情况下都会默认使用行级锁,貌似是需要有索引匹配到才行
锁的基本概念
在深入讨论行锁与表锁之前,我们先来回顾一下锁的基本概念。锁是数据库管理系统用来控制对数据的并发访问的一种机制。在MySQL中,锁分为共享锁(读锁)和排他锁(写锁)
在MySQL中,锁是用于管理并发访问数据库资源的一种机制,以确保数据的完整性和一致性。锁分为两种基本类型:共享锁(Shared Locks,通常称为读锁)和排他锁(Exclusive Locks,通常称为写锁)
共享锁(读锁)
共享锁是一种允许多个用户同时读取同一数据资源的锁类型。当一个事务对数据行或表持有共享锁时,其他事务也可以获取该数据行或表的共享锁,但无法获取排他锁。共享锁通常用于以下场景:
- 读取操作:当用户需要从数据库中读取数据时,数据库会为这些数据行或整个表添加共享锁。
- 非阻塞读取:共享锁允许多个事务同时读取数据,不会阻止其他读取操作,从而提高了并发性能。
- 隔离级别:在某些事务隔离级别下(如READ COMMITTED),MySQL会使用共享锁来实现非阻塞读取。
排他锁(写锁)
排他锁是一种不允许其他用户同时读取或写入同一数据资源的锁类型。当一个事务对数据行或表持有排他锁时,其他事务既不能获取该数据行或表的共享锁,也不能获取排他锁。排他锁通常用于以下场景:
- 写入操作:当用户需要向数据库中插入、更新或删除数据时,数据库会为这些数据行或整个表添加排他锁。
- 数据保护:排他锁确保在数据被修改时,没有其他事务可以访问这些数据,从而防止数据不一致。
- 隔离级别:在更高的事务隔离级别下(如REPEATABLE READ和SERIALIZABLE),MySQL会使用排他锁来防止脏读、不可重复读和幻读。
锁的兼容性
- 共享锁与共享锁:兼容。多个事务可以同时持有同一数据资源的共享锁。
- 共享锁与排他锁:不兼容。持有共享锁的事务不能获取排他锁,反之亦然。
- 排他锁与排他锁:不兼容。同一数据资源上不能同时存在多个排他锁。
锁的升级和降级
在某些情况下,MySQL可能会自动将共享锁升级为排他锁,或者将排他锁降级为共享锁,以满足事务的需求。例如,如果一个事务持有共享锁并尝试修改数据,MySQL会尝试将共享锁升级为排他锁。
了解共享锁和排他锁的工作原理对于优化数据库性能和设计高效的数据库应用至关重要。正确的锁策略可以减少锁争用,提高并发性能,同时确保数据的一致性和完整性。
全局锁、表锁、行锁
全局锁
全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。你可以理解为,全局锁基本上把数据所所有的变更语句都锁住了。
全局锁的典型场景应用场景是全库逻辑备份,也就是把整个库每个表都 select 出来存起来。上面说到全局锁会锁住所有变更语句,但这只是对于 MyISAM 存储引擎而言的。对于 Innodb 而言,其可以利用 MVCC 实现数据的一致性视图,从而不需要锁整个库就可以实现全库的数据备份。
表锁
表锁,顾名思义就是对某个表加锁。
表锁是一种粗粒度的锁,它锁定的是整个表。当一个表被锁定时,其他用户无法对该表进行读写操作,直到锁被释放。表锁通常在以下情况下使用:
- 全表扫描:当执行全表扫描操作时,使用表锁可以减少锁的开销。
- 批量操作:在进行大量数据的插入、更新或删除操作时,表锁可以减少锁的争用。
- 低并发环境:在并发较低的环境中,表锁可以简化锁管理,提高操作效率。
一般情况是对应的存储引擎没有行级锁(例如:MyIASM),或者是对应的 SQL 语句没有匹配到索引。
对于第一种情况而言,因为对应存储引擎不支持行锁,所以只能是使用更粗粒度的锁来实现,这也比较好理解。
对于第二种情况而言,如果存储引擎支持行锁,但对应的 SQL 就没有使用索引,那么此时也是会全表扫描,那此时也是会使用表锁。例如下面的语句没有指定查询列,或者指定了查询列但是并没有用到索引,那么也是会直接锁定整个表。
// 没有指定查询列
selectfrom user;
// 指定查询列,但是没有用到索引
selectfrom user where name = ‘zhangsan’;
上面说的索引,可以说是判断是否会用行级锁的关键
行锁
行锁是MySQL中一种细粒度的锁,它锁定的是数据库表中的一行或多行数据。行锁的优点是它能够提供较高的并发性,因为只锁定需要操作的数据行,而不会影响其他行。行锁通常在以下情况下使用:
- 事务隔离级别较高:在REPEATABLE READ或SERIALIZABLE隔离级别下,MySQL默认使用行锁。
- 高并发读写操作:当有大量的读写操作同时进行时,行锁可以减少锁的争用,提高系统性能。
- 使用索引进行查询:如果查询语句能够利用索引,MySQL会自动使用行锁。
何时使用行锁
- 高并发读写:在高并发读写的场景下,使用行锁可以减少锁的争用,提高系统的并发处理能力。
- 细粒度控制:当需要对单个或少数几条记录进行操作时,行锁可以提供更细粒度的控制。
- 避免锁升级:在某些情况下,如果事务只涉及少量数据行,使用行锁可以避免锁从行锁升级为表锁。
何时使用表锁
- 全表操作:当执行全表的插入、更新或删除操作时,使用表锁可以减少锁的开销。
- 批量数据处理:在处理大量数据时,表锁可以简化操作,提高效率。
- 低并发环境:在并发较低的环境中,使用表锁可以减少锁管理的复杂性。
额外思考:
如果查询或更新用到了索引,但是查询或更新的数据特别多,占全表的 80% 甚至更多,这时候是会用表锁,还是行锁呢?
在MySQL中,即使查询或更新操作使用了索引,如果涉及到的数据量非常大,比如占全表的80%或更多,MySQL的行为可能会取决于几个因素:
- 事务隔离级别:不同的隔离级别会影响锁的行为。例如,在REPEATABLE READ(MySQL的默认隔离级别)或SERIALIZABLE隔离级别下,MySQL倾向于使用行锁,但在高并发和大量锁定的情况下,可能会出现锁升级,即从行锁变为表锁。
- 锁的争用和死锁:如果大量的行被锁定,MySQL的锁管理器可能会决定升级为表锁以减少锁的争用和避免死锁。
- InnoDB的锁策略:InnoDB存储引擎有自己的锁策略,它试图平衡行锁和表锁的使用以优化性能。InnoDB会根据事务的大小和并发情况动态调整锁的行为。
- 锁的粒度:InnoDB通常优先使用行锁,但如果锁定的行数超过了一定比例(通常认为是表中行数的20%左右),InnoDB可能会将锁升级为表锁。
- 具体的SQL操作:某些特定的SQL操作,如UPDATE或DELETE涉及大量数据,即使使用索引,也可能触发表锁。
- 系统配置和版本:MySQL的配置和版本也会影响锁的行为。例如,某些配置参数可以调整锁升级的阈值。
在实际操作中,如果确实涉及到大量数据的查询或更新,并且对性能有严格要求,建议采取以下措施:
- 优化索引:确保索引设计得当,以减少锁的范围和提高查询效率。
- 分批处理:将大量数据的操作分批进行,每次处理一小部分数据,以减少锁的影响。
- 调整隔离级别:根据业务需求,适当调整事务隔离级别。
- 监控和调优:使用MySQL的监控工具来观察锁的行为,并根据实际情况进行调优。
总之,MySQL会根据当前的事务情况和系统配置来决定使用行锁还是表锁。如果操作涉及的数据量非常大,即使使用了索引,也可能会使用表锁,特别是当系统认为这样做可以提高性能或减少死锁风险时。
相关文章:
MySql什么时候表锁or行锁?
文章目录 锁的基本概念共享锁(读锁)排他锁(写锁)锁的兼容性锁的升级和降级 全局锁、表锁、行锁全局锁表锁行锁 何时使用行锁何时使用表锁额外思考: 在数据库的世界里,性能优化是一个永恒的话题。MySQL作为广…...
Stable Diffusion WebUI详细使用指南
Stable Diffusion WebUI(AUTOMATIC1111,简称A1111)是一个为高级用户设计的图形用户界面(GUI),它提供了丰富的功能和灵活性,以满足复杂和高级的图像生成需求。由于其强大的功能和社区的活跃参与&…...
Android中focusableInTouchMode会导致第一次点击事件失效
我们很多时候会对某些View设置点击事件,但是,当对这个View同时设置了focusableInTouchModetrue时,第一次点击事件会被消费为为此View获取焦点。 <Viewandroid:id"id/v_click"android:layout_width"match_parent"andr…...
C语言| 输出菱形*(梳理篇II)
C语言| 输出菱形*-CSDN博客 凡事还是得自己独立思考后,写一遍程序才能发现问题所在。 容易犯的错误: 【完整程序注释】 运行结果 /* 输出菱形 1 总行数 n为奇数,分上三角形下三角形,只考虑左边的空格和星号* 2 上三角形 行数…...
conda使用
因为时不时搜索conda操作,就想着逐步将先前的conda使用整理在一起,并添加新的内容。 目录 0.简介1.常用操作场景1.1 取消终端conda自动启动 0.简介 1.常用操作场景 1.1 取消终端conda自动启动 安装conda后取消命令行前出现的base,取消每次…...
适合小白学习的项目1949java图片管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java图片管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发&…...
Jmeter实战教程入门讲解
前言 通过前面对Jmeter元件的讲解,大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序,可以看看我这篇性能测试学习之路(三)—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…...
Flutter 中的 PrimaryScrollController 小部件:全面指南
Flutter 中的 PrimaryScrollController 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的滚动机制中,PrimaryScrollController 起着至关重…...
Windows线程同步的四种方式和区别
1. Windows线程同步的四种方式 2. 区别 Critical Section更多强调的是保护,Event对象、Mutex对象与Semaphore对象更多的强调的是同步;Critical Section对象是无法设置等待超时的,而其他三个对象则可以设置等待超时,从这一点来讲…...
C++ 20新特性之Concepts
C20的新特性之一Concepts,为C的模板编程带来了重大的改进和便利。以下是关于C20中Concepts特性的详细介绍: 基本概念 定义:Concepts是C20中引入的一种新的语言特性,用于限制类和函数模板的模板类型和非类型参数。它允许你为模板编…...
MATLAB基础应用精讲-【数模应用】SPSSAU数据处理
目录 SPSSAU 标题修改 1、说明 2、举例 数据标签 1、说明 2、举例...
AI大模型探索之路-实战篇15: Agent智能数据分析平台之整合封装Tools和Memory功能代码
系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6:掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…...
CV每日论文--2024.6.4
1、Mixed Diffusion for 3D Indoor Scene Synthesis 中文 标题:用于 3D 室内场景合成的混合扩散 简介:这篇论文提出了一种名为MiDiffusion的混合离散-连续扩散模型,用于从给定的房间类型、平面图和可能存在的物体中合成逼真的3D室内场景。 作者指出,该…...
Android bw_costly_<iface>链
测试时关注到bw_costly_链 因为和iface有关。猜测这个链是动态生成的。 开关数据业务测试,果然关闭数据业务后,bw_OUTPUT中不再会调用bw_costly_rmnet_data3,也没有bw_costly_rmnet_data3这个链了。 再次打开数据业务后出现了bw_costly_rmnet…...
TypeScript 项目,自身 package 是 A,它引用了 B package。项目编译时,选择依赖版本的机制是什么?
在 TypeScript 项目中,当 package A 引用了 package B,编译 A 的过程中,B package 将按照 B package 自身的 package.json 文件中指定的各个库的版本进行编译,而不是按照 A package 中的库版本。 每个 package 都有自己的依赖项和…...
【数据结构】链表----头结点的作用
链表是一种常见的数据结构,由一系列节点(Node)组成,每个节点包含数据和指向下一个节点的指针。链表的头结点(Head Node)也称为哨兵位,是链表的起点,通常有以下几个重要作用ÿ…...
(CVPRW,2024)可学习的提示:遥感领域小样本语义分割
文章目录 相关资料摘要引言方法训练基础类别新类别推理 相关资料 论文:Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 代码:https://github.com/SteveImmanuel/OEM-Few-Shot-Learnable-Prompt 摘要 小样本分割是一项…...
tinyrenderer-切线空间法线贴图
法线贴图 法线贴图分两种,一种是模型空间中的,一种是切线空间中的 模型空间中的法线贴图的rgb代表着每个渲染像素法线的xyz,与顶点坐标处于一个空间,图片是五颜六色的。 切线空间中的法线贴图的rgb同样对应xyz,是切线…...
C++的vector使用优化
我们在上一章说了如何使用这个vector动态数组,这章我们说说如何更好的使用它以及它是如何工作的。当你创建一个vector,然后使用push_back添加元素,当当前的vector的内存不够时,会从内存中的旧位置复制到内存中的新位置,…...
关于stm32的复用和重映射问题
目录 需求IO口的复用和重映射使用复用复用加重映射 总结参考资料 需求 一开始使用stm32c8t6,想实现pwm输出,但是原电路固定在芯片的引脚PB10和PB11上,查看了下引脚的功能,需要使用到复用功能。让改引脚作为定时器PWM的输出IO口。…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...
