Mysql表锁与行锁

news2024/10/7 12:27:07

Mysql锁实战

  • 前言:什么是锁
  • 一:全局锁
    • 1.1 概念
    • 1.2 作用
    • 1.3 使用
    • 1.4 特点
  • 二:表级锁
    • 2.1 概念
    • 2.2 分类
      • 2.2.1 表锁
      • 2.2.2 元数据锁 MDL
      • 2.2.3 意向锁
  • 三:行级锁
    • 3.1 行锁(Record Lock)
    • 3.2 间隙锁(Gap Lock)
    • 3.3 临键锁(Next-Key Lock):
  • 四:锁总结

前言:什么是锁

  • 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是
  • 一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂

一:全局锁

1.1 概念

  • 全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
  • 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

1.2 作用

在这里插入图片描述
全库备份的时候,表是一个一个进行备份的,如果整体的数据库未被锁住,业务系统仍然在进行写入数据,由于有的表已经备份万比例,其余的表则会发生数据不一致的问题。

1.3 使用

  • 加锁:flush tables with read lock
  • 解锁:unlock tables

1.4 特点

数据库中加全局锁,是一个比较重的操作,存在以下问题:

  1. 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  2. 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。
    解决方式:
    在InnoDB引擎中,我们可以在备份时加上参数-single-transaction参数来完成不加锁的一致性数据备份

二:表级锁

2.1 概念

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。

2.2 分类

2.2.1 表锁

对于表锁,分为两类:

  1. 表共享读锁(read lock)
    加上读锁之后,所有得客户端都只能读表数据不能修改表数据。
    加锁:lock tables 表名… read/write、释放锁:unlock tables/客户端断开连接
  2. 表独占写锁(write lock)
    加上写锁之后,其他客户端不能读,不能写。当前客户端可以读、写

2.2.2 元数据锁 MDL

  • MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。
  • MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。
  • 为了避免DML与DDL冲突,保证读写的正确性。
    备注:
    DDL:数据定义语言
    DML:数据操作语言
    DQL:数据查询语言
    DCL:数据控制语言

2.2.3 意向锁

为了避免DML在执行时,加的行锁与表锁的冲突,在IoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
意向锁分为以下两种:

  1. 意向共享锁(IS):与表锁共享锁(read)兼容,与表锁排它锁(write)互斥。由语句select…lock in share mode添加。
  2. 意向排他锁(IX):与表锁共享锁(read)及排它锁(write)都互斥。意向锁之间不会互斥。由insert、.update、delete、select…for update添加。

三:行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最纸,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。
行级锁主要分为以下三类:

3.1 行锁(Record Lock)

锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持
在这里插入图片描述

  • 加锁规则
    在这里插入图片描述

3.2 间隙锁(Gap Lock)

锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。

3.3 临键锁(Next-Key Lock):

行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

四:锁总结

本文介绍了MySQL中的锁机制,并讨论了全局锁、表级锁和行级锁的概念、使用方法和特点。

  • 全局锁是对整个数据库实例加锁,常用于全库的逻辑备份,以获取一致性视图,保证数据的完整性。然而,全局锁会导致数据库的写操作和同步过程受阻,因此备份期间可能需要停止业务系统或导致主从延迟。解决方式是在InnoDB引擎中使用参数-single-transaction来完成不加锁的一致性数据备份。

  • 表级锁是每次操作锁住整张表,适用于MyISAM、InnoDB、BDB等存储引擎。表级锁分为表共享读锁和表独占写锁,分别控制对表的读和写操作。此外,MySQL还引入了元数据锁(MDL),用于维护表元数据的一致性,避免DML和DDL冲突。

  • 行级锁是每次操作锁住对应的行数据,适用于InnoDB存储引擎。行级锁通过对索引项加锁来实现,分为行锁、间隙锁和临键锁。行锁用于锁定单个行记录,防止其他事务对该行进行修改或删除。间隙锁用于锁定索引记录间隙,防止其他事务在间隙中插入数据,从而避免幻读问题。临键锁是行锁和间隙锁的组合,同时锁定数据行和数据前面的间隙。

综上所述,锁在数据库中起到保证数据并发访问一致性和有效性的重要作用。不同级别的锁机制适用于不同的场景,开发人员需要根据实际情况选择合适的锁策略以提高数据库的并发性能。

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

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

相关文章

redis乐观锁概念

乐观锁(又名乐观并发控制,Optimistic Concurrency Control,缩写“OCC”),是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。…

Ubuntu下安装、配置及重装CUDA教程

安装CUDA 前往Nvidia CUDA Tools官网选择对应的架构和版本下载CUDA 以如下架构和版本为例: 查看显卡驱动 nvidia-smi如果显卡驱动已经装了,那么在CUDA安装过程中不用再勾选安装driver 下载并安装CUDA wget https://developer.download.nvidia.co…

如何设计一个完美的复杂业务系统架构?

1 什么是复杂系统 我们经常提到复杂系统,那么到底什么是复杂系统。我们看下维基的定义:复杂系统(英语:complex system),又称复合系统,是指由许多可能相互作用的组成成分所组成的系统。强调了两…

字幕切分视频

Whisper 仓库地址: https://github.com/openai/whisper 可用模型信息: 测试视频:18段,总共447S视频(11段前:有11段开头有停顿的视频) Tiny: 跑完:142S ,11段前&#xf…

微服务sleuth+zipkin——链路追踪

一、链路追踪🍉 1.什么是链路追踪?🥝 在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要…

深入理解Java虚拟机(二)Java内存区域与内存溢出异常

一、前言 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序…

IEC 103/104

IEC101 串口通信 串口远动协议 控制区和数据区,(信息体地址,装置地址等) IEC102 电量采集 IEC103 保护设备的通信 串口 实时监测 各种故障 103协议就是用来保护装置和后台监控进行通信的。 IEC104 调度自动化系统、厂站之间的通讯 网络 帧里面多了…

Ansible Playbook剧本配置文件

一、执行文件 Playbook配置文件使用YAML语法,具有简 洁明了,结构清晰等特点。Playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表,前面介绍的ansible命令虽然可以完成各种任务&a…

学习记录——SAM、SPM

Segment Anything Model(SAM) 能分割一切的模型 2023 SAM是一个提示型模型,其在1100万张图像上训练了超过10亿个掩码,实现了强大的零样本泛化。许多研究人员认为「这是 CV 的 GPT-3 时刻,因为 SAM 已经学会了物体是什…

EFLFK——ELK日志分析系统+kafka+filebeat架构(有乌云的天反而是最美的)

文章目录 1.修改filebeat配置文件filebeat.yml收集日志转发(生产)给kafka2.修改logstash配置从kafka中消费日志,并输出到kibana前端展示 在ELFK的基础上,添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&am…

appium自动化测试中控件坐标及控件属性获取

在appium有时会遇到content-desc中存在内容的情况,有时需要校验它的值,那么它是怎么获取的呢? driver.find_element_by_XX().get_attribute("contentDescription") 使用上边的方式可以获取到content-desc中的值。 像上图中我们其…

《3.linux应用编程和网络编程-第9部分-3.9.linux网络编程实践》3.9.6_7.soekct实践编程1_2

概念:端口号,实质就是一个数字编号,用来在我们一台主机中(主机的操作系统中)唯一的标识一个能上网的进程。端口号和IP地址一起会被打包到当前进程发出或者接收到的每一个数据包中。每一个数据包将来在网络上传递的时候…

人工智能顶会投稿截止时间汇总

一、NeurIPS 1. 会议名称及等级 Annual Conference on Neural Information Processing Systems(CCF-A)https://dblp.uni-trier.de/db/conf/nips/index.html 2. 投稿时间及接收率 https://neurips.cc/Conferences/2023/CallForPapers#OpenReview 一般…

(Linux)基础命令

帮助文档 公式功能man 命令名访问Linux手册页命令名 – helpinfo 命令名查看命令的功能,来源,选项等whatis 命令名 ls 公式功能ls [选项][目录或文件]对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及…

linux kernel单独编译某项驱动

linux内核经常涉及编译某一项驱动代码的场景,本次以网卡驱动e1000为例说明整个步骤流程。 首先编译内核驱动不必要编译整个内核,但编译的驱动代码必须要和要安装的内核版本保持一致,否则经常会出现无法加载模块。 在编译驱动前,最…

2023年上半年系统集成项目管理工程师成绩什么时候出

一般是考后30个工作日左右,即2023年7月中下旬出成绩的概率比较大,只能耐心等待了,届时软考办官网会发布成绩查询通知。 注意!!2023年上半年系统集成项目管理工程师成绩查询方法跟以前有点区别: 以前&…

C++入门学习(1)

一&#xff0c;我的第一个C程序 代码&#xff1a; #include<iostream> using namespace std; int main() {cout << "hello world" << endl; } 这是我写的第一篇关于C的博客&#xff0c;上面的程序也是我写的第一个C程序。对于用惯了C语言的我来说…

【GlobalMapper精品教程】062:基于DEM制作仿地飞行DSM文件(适用于精灵4RTK)

仿地飞行指的是无人机根据获取的地形数据调整飞行高度,保持对地的恒定高差。目前,主要有实时仿地、导入高程(高度)数据仿地两种仿地飞行方式。本文讲解基于DEM数字高程模型进行仿地DSM高程文件制作的方案。 文章目录 一、确定外业范围二、下载准备DEM三、仿地DSM制作1. 裁剪…

python VTK vtkImplicitBoolean 布尔切割

VTK中包含可以执行布尔操作的接口有vtkImplicitBoolean&#xff0c;vtkBooleanOperationPolyDataFilter&#xff0c;vtkLoopBooleanPolyDataFilter。 布尔操作包括&#xff1a;布尔加&#xff0c;布尔减和布尔交。 code: #!/usr/bin/env python""" This examp…

不是吧?强大的 vite 居然不支持内 SVG 转 Base64 内嵌?

大家好&#xff0c;我是前端西瓜哥。 诶哟喂&#xff0c;SVG 怎么没内嵌&#xff1f; 最近啊&#xff0c;西瓜哥我用 vite 去给一个项目构建&#xff08;vite build&#xff09;一个应用。打包结果是一个 html 和一些加了哈希的资源。 然后打包出来的文件一看&#xff0c;发…