MySQL 锁

news2024/11/28 4:50:34

        在之前的文章有多次提到,MySQL在数据更新和性能优化上会用到锁机制。我们在实际的应用中也经常会遇到锁相关的问题,即使很多时候我们并没有人为的为数据库添加锁,但还是会出现死锁的问题,这是因为在我们操作数据时MySQL隐式的帮我们加了锁。这篇文章主要讲一下MySQL锁的类型和锁与锁之间的关联。

锁类型

按照操作类型划分:读锁、写锁。

1. 读锁

        读锁也叫共享锁(S 锁),它是一种读共享写阻塞的锁,当对表里的某一行数据添加S锁时,其他事务对其写时会阻塞,但可以对它进行读操作。同时其他事务可以对该数据添加S锁,但不能添加X锁。因此S锁和S锁可兼容,S锁和X锁不能兼容。

2. 写锁

        写锁也叫排他锁(X 锁),它是一种对任何锁都阻塞的锁,当对表里的某行数据添加X锁时,其他事务时不允许再对它添加S锁和X锁。

3. 意向锁

        意向锁是表级锁,又分为意向读锁(IS 锁)和意向写锁(IX 锁),它是基于在InnoDB存储引擎下的一种锁,意向锁无法手工添加,是由存储引擎自动添加的。

        当事务操作需要获取数据行的锁时,首先需要先获取表对应的意向锁。当需要对表添加表级的锁时,会判断是否存在意向锁,而不用每一行判断是否有行锁,这样可以大大提高数据库的性能。
        意向锁之间是相互兼容的,它们相互之间不会阻塞对方获取锁。

按照颗粒度划分:表锁、行锁、间隙锁

1. 表锁

        针对表操作的锁,MyISAM存储引擎下目前只支持表锁。对表进行加锁,加锁速度快、锁的颗粒大、不会出现死锁。但是容易出现锁冲突,性能要低,容易造成阻塞,并发度低。

2. 行锁

        针对数据行操作的锁,InnoDB存储引擎下支持表锁和行锁。加锁的速度慢需要查找到对应的数据行,锁颗粒度小,容易出现死锁,并发度高。当需要对数据进行检索操作时最好能够使用索引,避免全表扫描,如果是全表扫描那么行锁即变为表锁。

3. 页锁

        针对数据页操作的锁,是基于BerkeleyDB存储引擎的锁,锁定的颗粒度介于行锁与表锁之间,所以它的并发度和资源的开销也是介于行锁与表锁之间。

4. 间隙锁

        当检索条件为范围检索,并对检索的结果进行加锁,InnoDB会对当前检索出来已有的数据加锁,并对检索范围内不存在记录的间隙也加锁,这就叫间隙锁。

        举例:

        user表:

idnameage
1张三18
2李四30

      1. 当使用精确检索时

        事务1:

        select * from user where age=18 and age=30 for update;

        事务2:

        insert into user(name,age) values('王五',20);

        这种情况下事务1精确检索,只会对这两行数据进行加锁,因此事务2可正常执行。

        2. 当使用范围检索时

        事务1:

        select * from user where age>=18 and age<=30 for update;

        事务2:

        insert into user(name,age) values('王五',20);

       事务1使用范围检索,InnoDB会对这两行数据进行加锁同时也会对18到30之间的间隙也加锁,因此事务2将会阻塞不可执行。

        间隙锁的引入是为了解决在RR隔离级别的幻读问题。

锁之间兼容性

共享锁排他锁意向共享锁意向排他锁
共享锁兼容互斥兼容互斥
排他锁互斥互斥互斥互斥
意向共享锁兼容互斥兼容兼容
意向排他锁互斥互斥兼容兼容

       从以上表格中可以看出排他锁与任何锁都不兼容,共享锁只与共享锁兼容,意向锁之间都兼容。

死锁

        死锁是指多个事务在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将一直处于等待状态。

        可以通过以下语句查看锁的状态,最终找到相应产生死锁相应的进程,人工kill该进程释放锁的状态。

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

总结

        MySQL中存在不同颗粒度的锁,从小到大有,行锁、间隙锁、页锁、表锁,锁的颗粒度越大消耗的资源越小,但并发度越低。不同的存储引擎对锁的实现也不一样。InnoDB支持行锁、间隙锁和表锁,MyISAM只支持表锁,BerkeleyDB支持页锁和表锁。

        锁的添加是需要消耗资源的,如果锁添加的越多性能就会相应的降低,同时也会出现锁冲突或者是死锁的情况,所以在实际的应用中根据实际情况加锁,不要盲目的添加从而造成系统性能降低甚至崩溃。

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

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

相关文章

java UDP通信程序DatagramSocket数据发送

首先 我们先来了解一下 UDP 首先 他是一种不可靠的网络协议 他在通信的两端 各建立一个 Socke对象 但是他们只是 发送和接收数据的对象 发送端只管发送 不会顾及接收端是否接到 接收到只负责接收数据 而不会给出发送端反馈 因此对于UDP通信的双方而言 是有没什么 客户端和服务…

架构师进阶,微服务设计与治理的 16 条常用原则

今天将从存储的上一层「服务维度」学习架构师的第二项常用能力 —— 微服务设计与治理。 如何设计合理的微服务架构&#xff1f; 如何保持微服务健康运行&#xff1f; 这是我们对微服务进行架构设计过程中非常关注的两个问题。 本文对微服务的生命周期定义了七个阶段&#xf…

正大国际期货:为什么外盘期货顺势交易这么难

要回答“为什么趋势交易这么难&#xff1f;”需要先回答&#xff1a;“为什么交易&#xff1f;”。 你应该为了抓住赚取期望利润的机会而交易&#xff0c;为了长期持续赚钱的目的而交易&#xff0c;而不是为了赚得短期利润的喜悦而交易&#xff0c;也不是为了证明你的市场分析…

音频转文字怎么转?这些方法值得一试

在日常生活中我们经常会遇到要把音频转换成文字的情况&#xff0c;很多小伙伴还在使用传统的方法&#xff0c;一边播放一边记录。虽然这样能解决问题&#xff0c;但是需要花费很多时间&#xff0c;效率特别低。我们不妨尝试使用一些转换软件&#xff0c;这样就能节省很多时间了…

界面组件Kendo UI for Angular——让应用数据显示更直观!(二)

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求&#xff0c;通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for Angular是专用于Angular开发的专业级Angular组件&#xff0c;telerik致力于提供纯粹的高性能Angular UI组件&#xff0c…

Word处理控件Aspose.Words功能演示:在 Java 中将 Word DOCX 转换为 Markdown

如今&#xff0c;Markdown ( MD ) 格式被广泛用于编写在线文章、博客和文档。但是&#xff0c;在大型文档的情况下&#xff0c;它的语法变得难以记忆和书写。为方便起见&#xff0c;您可以在 MS Word 中编写内容&#xff0c;然后将DOCX文件转换为 Markdown。为了以编程方式执行…

nacos--基础--5.2.2--集成--SpringCloud--服务注册,发现,负载均衡

nacos–基础–5.2.2–集成–SpringCloud–服务注册&#xff0c;发现&#xff0c;负载均衡 代码位置 https://gitee.com/DanShenGuiZu/learnDemo/tree/master/nacos-learn1、介绍 服务发现客户端 从服务发现中心获取服务列表服务消费 通过负载均衡获取服务地址 2、添加依赖 …

jdk安装配置教程2022年12月最新版

这两天配了好几遍jdk&#xff0c;删了又下下了又删&#xff0c;总结一下&#xff0c;也算有点收获 1. 下载&#xff1a;官网Java Downloads | Oracle jdk1.8在下面&#xff0c;上面是最新的jdk17和jdk19 2.下载完成后&#xff0c;一路安装解压&#xff08;我撞在了C盘&#…

IfcOpenShell简明教程【BIM】

IFC 是用于存储 BIM 数据的 ISO 标准格式。 IfcOpenShell 是一个包含 Python 库的项目&#xff0c;可以用来解析 IFC 文件。 1、下载安装IfcOpenShell 首先&#xff0c;我们需要下载并安装 IfcOpenShell python。 目前没有 IfcOpenShell 的 API 文档&#xff0c;但考虑到它主…

Vector源码解析

Vector源码解析 简介 Vector 是一个古老的 线程安全(内部的核心方法都加了synchronized) 的容器&#xff0c;在 JDK1.0 时就已经存在&#xff0c;到如今已经很少使用。 基本结构与 ArrayList 类似&#xff0c;可以认为是线程安全版本的 ArrayList&#xff0c;但因为 Vector …

BCN-PEG-FITC 环丙烷环辛炔聚乙二醇荧光素 BCN-PEG-荧光素

双环[6,1,0]壬炔 (BCN) &#xff08;环丙烷环辛炔&#xff09;可以通过无铜的点击化学与叠氮化物标记的分子或生物分子反应生成稳定的三氮唑连接。 产品名称 BCN-PEG-FITC 环丙烷环辛炔聚乙二醇荧光素 中文名称 环丙烷环辛炔聚乙二醇荧光素 英文名称 BCN-PEG-FITC 分子…

基于Android的二维码识别系统的研究 与实现

XXXX 本科生毕业设计(论文) 学院(系)&#xff1a; XX 专 业&#xff1a; XX 学 生&#xff1a; XX 指导教师&#xff1a; XX XX 完成日期 年 月 XXX本科生毕业设计&#xff08;论文&#xff09; 基于Android的二维码识别系统的研究 与实现 Research and Implementati…

防重放、防篡改攻击的实现(Java版)

文章目录一、问题描述1、什么是重放攻击、篡改攻击&#xff1f;2、如何模拟重放攻击、篡改攻击&#xff1f;2.1、重放攻击模拟方式2.2、篡改攻击模拟方式二、解决方案三、在项目中使用1、项目简介2、项目实践一、问题描述 1、什么是重放攻击、篡改攻击&#xff1f; 1、重放攻击…

【SSM框架】为集合类型属性赋值

&#x1f353;个人主页&#xff1a;个人主页 &#x1f352;系列专栏&#xff1a;SSM框架 目录 1.为集合类型属性赋值 ①为List集合类型属性赋值 ②为Map集合类型属性赋值 2.p命名空间 3.引入外部属性文件 1.为集合类型属性赋值 ①为List集合类型属性赋值 在Clazz类中添加…

中国三大主流开源Linux操作系统社区及其产品生态

作者&#xff1a;IT圈黎俊杰 操作系统是基础软件的核心&#xff0c;是科技研发必备的底层支撑产品&#xff0c;它的核心技术至今仍然由美国为代表的西方国家所掌控着。由于以前国产操作系统产业长期处于“多、小、散”的状态&#xff0c;未能建立起完善的生态、未能研发出真正好…

python笔记(一)

文章目录字节对象与字符转换动态爬虫实施辅助工具python 部分内置方法示例&#xff1a;python虚拟环境的创建与激活执行多个.py程序获取当前系统默认浏览器名称反编译小程序PC端小程序&#xff08;wxapkg&#xff09;解密&#xff1a;反编译字节对象与字符转换 data1 babc # …

计算机系统实验-BombLab

一.实验题目及目的 1.实验题目 程序运行在linux环境中。程序运行中有6个关卡&#xff08;6个phase&#xff09;&#xff0c;每个phase需要用户在终端上输入特定的字符或者数字才能通关&#xff0c;否则将会引爆炸弹。需要通过分析汇编代码&#xff0c;使用gdb调试等方式找到正…

oracle入门-19c 安装详细教程

我们知道学习一门技术&#xff0c;第一件事情就是搭建对应的环境。本教程将详细教大家如何安装oracle。 目录一、虚拟机创建二、挂载镜像、安装及系统配置三、 软件包传输四、数据库安装五、 图形化向导建库一、虚拟机创建 处理器数量根据自己的机器配置进行调整&#xff08;4 …

Android IPC机制

本文首发于个人博客 “胖蔡叨叨叨”&#xff0c;更多相关信息可点击查看《Android IPC机制》​​​​​​​ IPC IPC(Inter Process Communication) 进程间通信&#xff0c;是指系统中运行的不同进程间的信息交互过程。Android IPC通常用于应用间、或同应用不同进程间的数据通…

3分钟读懂数据可视化如何帮助企业智慧管理,提升管理水平

随着大数据时代的到来&#xff0c;企业管理的决策越来越倚重数据指标&#xff0c;通过数据指标了解公司运作的情况&#xff0c;产品生产销售情况&#xff0c;收入与支出情况等等&#xff0c;更大的作用是对商业趋势预测提供了决策依据&#xff0c;使公司提前布局未来&#xff0…