java八股文面试[数据库]——MySQL死锁的原因和处理方法

news2024/11/18 11:47:46
1) 表的死锁

产生原因:

用户A访问表A(锁住了表A),然后又访问表B;另一个用户B访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

用户A--》A表(表锁)--》B表(表锁)

用户B--》B表(表锁)--》A表(表锁)

解决方案

这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法

仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。

2) 行级锁死锁

产生原因1:

如果在事务中执行了一条没有索引条件的查询,引发全表扫描,把行级锁上升为全表记录锁定(等价于表级锁),多个这样的事务执行后,就很容易产生死锁和阻塞,最终应用系统会越来越慢,发生阻塞或死锁。

解决方案:

SQL语句中不要使用太复杂的关联多表的查询;使用explain“执行计划"对SQL语句进行分析,对于有全表扫描全表锁定的SQL语句,建立相应的索引进行优化。

产生原因2:

- 两个事务分别想拿到对方持有的锁,互相等待,于是产生死锁

image.png

产生原因3:

每个事务只有一个SQL,但是有些情况还是会发生死锁.

1. 事务1,从name索引出发 , 读到的[hdc, 1],  [hdc, 6]均满足条件, 不仅会加name索引上的记录X锁, 而且会加聚簇索引上的记录X锁, 加锁顺序为先[1,hdc,100], 后[6,hdc,10]
2. 事务2,从pubtime索引出发,[10,6],[100,1]均满足过滤条件,同样也会加聚簇索引上的记录X锁,加锁顺序为[6,hdc,10],后[1,hdc,100]。
3. 但是加锁时发现跟事务1的加锁顺序正好相反,两个Session恰好都持有了第一把锁,请求加第二把锁,死锁就发生了。

image.png

解决方案:

 如上面的原因2和原因3,  对索引加锁顺序的不一致很可能会导致死锁,所以如果可以,尽量以相同的顺序来访问索引记录和表。在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大降低出现死锁的可能;

如何避免死锁

为了避免死锁,可以采取以下措施:

1 保持锁的顺序一致。在多个事务请求资源的情况下,要保持锁的请求顺序一致,这可以避免死锁的发生。

2 尽量缩短事务的持有时间。如果事务持有锁的时间过长,会增加死锁的风险。因此,在处理事务时,应尽量缩短事务的持有时间,尽快释放锁。

3 尽量减少事务的嵌套。如果事务嵌套层数过多,会增加死锁的风险。因此,在编写事务时,应尽量减少事务的嵌套层数,避免死锁的发生。

4 使用超时机制。如果一个事务等待锁的时间过长,可以使用超时机制来终止该事务,从而避免死锁的发生。

如何解决死锁

如果避免死锁失败,可能需要采取以下措施来解决死锁:

1 检测死锁。数据库管理系统通常提供死锁检测机制,可以检测出死锁的发生,并且可以中止其中一个事务,从而解除死锁。

2 优化锁的使用。如果死锁的发生频率较高,可能需要重新设计数据库架构,优化锁的使用,从而降低死锁的发生率。

3 重构事务。如果死锁的发生频率较高,可能需要重构事务,重新设计事务的逻辑,从而避免死锁的发生。

4 增加资源。如果死锁的发生频率较高,可能需要增加资源,例如增加服务器的处理能力或增加数据库的缓存空间,从而降低死锁的发生率。

 innoDB死锁检测原理

innoDB 检测死锁通过等待图来检测死锁,如果等待图有回路,则表示有循环依赖,相互等待的情况,则表示有死锁。

等待图需要通过2张表来构建,当前锁的信息表 和 当前事务等待表

  1. 当前锁的信息表
select * from performance_schema.data_locks;

这个图可以看出,线程 61 获得了id = 1 的排他锁,而 线程 63 获得了 id = 100 的排他锁。

  1. 当前事务等待表
select * from performance_schema.data_lock_waits;

这个图可以看出,在线程 63(也就是获得了 id = 100 排他锁的线程)在尝试获取 id = 1 时 被 block 了,block 他的线程是线程 61,因为线程 61 正在获得 id = 1 的排他锁。

如果在继续执行线程 61 尝试获取 id = 100 的记录,会获取如下的结果

通过这两张表, innoDB 可以绘出如下的图

  1. 首先有多少个事务,就有多少个点,在这个例子里,有2个事务,线程 61 和 63
  2. 线程 61 在等待 线程 63,尝试获取 id = 100 的记录,所以 61 - 63 有一条边
  3. 线程 63 在等待 线程 61,尝试获取 id = 1 的记录,所以 63 - 61 有一条边

最后判断图中是否有回路,如果有回路,则认为有死锁,若发现有死锁,回滚 undo 量最小的记录的事务。

知识来源:马士兵教育

百度安全验证

【数据库】数据库死锁 - 知乎

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

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

相关文章

ZooInspector

一、在window,使用我们先打开Zookeeper,目录bin下的zkServer.cmd,把Zookeeper运行起来 ​编辑https://img.111com.net/attachment/art/187687/5f0c25fbe580c.png 二、可以使用目录bin下的zkCli.cmd,查询Zookeeper数据的方式,但是…

大模型浪潮席卷!和鲸科技入选创业邦“2023值得关注的125家AIGC企业”榜单

为以专业视角发掘现阶段积极探索 AIGC 技术和应用的企业,对接企业与场景,推动技术落地,创业邦于近日发布了“2023 值得关注的 125 家 AIGC 企业”榜单,和鲸科技凭借旗下 ModelWhale 数据科学协同平台在承载气象大模型的构建与应用…

企业怎么选择广告片的投放途径

TVC广告片和宣传片都是常见的企业营销工具,每种形式都有各自的特点和适用场景。选择哪种形式更适合企业投放,取决于多个因素,包括目标受众、营销目标、预算和信息传递需求等。接下来由深圳TVC广告片制作公司老友记小编从以下几个方面介绍它们…

【Python报错解决方案】DeprecationWarning: `np.float` is a deprecated

报错amoconda libsite-packages sklearn linear model least ngl.py30: Deprecationmarming: mp.float is a deprecated alias for the builtinfloat , To silence this warning, wse flat by itself. Doing this will not modify amy behavior and is safe. If you specifical…

机器学习基础算法--回归类型和评价分析

目录 1.数据归一化处理 2.数据标准化处理 3.Lasso回归模型 4.岭回归模型 5.评价指标计算 1.数据归一化处理 """ x的归一化的方法还是比较多的我们就选取最为基本的归一化方法 x(x-x_min)/(x_max-x_min) """ import numpy as np from sklea…

python超详细基础教程:元组和集合

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 元组和集合是Python中的基本类型 python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一,元组 元组(tuple)由小括号、逗号和数据对象构成的集合,各个项通过逗号…

毕业设计-摄像头识别二维码

本毕业设计采用imx6ull-linux4.1.15-qt5.6开发板进行测试 相关交叉编译包和摄像头测试程序已上传:https://download.csdn.net/download/qq_42952079/88282608 将zbar和opencv下的lib库文件拷贝到开发板的lib目录下,将camera可执行文件拷贝到开发板目录下…

解锁前端Vue3宝藏级资料 第四章 VUE常用 UI 库 1 ( element-plus,Ant ,naiveui,ArcoDesign)

现在常用的前台UI 分别是以下几种,我们将从中间选择介绍几个主流的UI的用于后台的系统搭建与开发。 Ant Design Vue element-plusnaiveuiArcoDesignBootstrap Vue Buefy Chakra UI Framevuerk Oruga Tachyons Tailwind CSS NutUI Vant Vuetify.js第一章 Vue3项目创建…

[machine Learning]推荐系统

其实严格来说推荐系统也是一种监督学习,我们需要根据已有数据进行预测,但是这种训练数据不是单纯的输入和输出问题,所以被归类为"超越监督学习"的一种? 今天去旁听了隔壁专业的机器学习课程,感觉自己的知识确实不是很系统,所以后面会找个机会把前面的代码给补充上.…

【肝素··】

Recent advances in the management of venous thromboembolism Korean J Hematol 2010;45:8-13 Serpin Structure, Mechanism, and Function-2002 糖胺聚糖 凝血 Fibrinolysis | Detailed Pedia

2023百度云智大会:科技与创新的交汇点

​ 这次的百度云智大会,可谓是亮点云集—— 发布了包含42个大模型、41个数据集、10个精选应用范式的全新升级千帆大模型平台2.0,发布首个大模型生态伙伴计划,而且也预告了文心大模型4.0的发布,大模型服务的成绩单也非常秀&#x…

文件重命名不再繁琐:MetaRename for Mac帮你简化重命名流程

文件重命名是我们在日常使用电脑时经常需要进行的一项任务。但是,有时候我们需要批量重命名文件,并且希望在新文件名中添加一些特定的信息,比如日期、时间、序号等。这时候,使用MetaRename for Mac可以帮助你轻松完成任务。 Meta…

手写Spring:第7章-实现应用上下文

文章目录 一、目标:实现应用上下文二、设计:实现应用上下文三、实现:实现应用上下文3.1 工程结构3.2 Spring应用上下文和Bean对象扩展类图3.3 对象工厂和对象扩展接口3.3.1 对象工厂扩展接口3.3.2 对象扩展接口 3.4 定义应用上下文3.4.1 定义…

Python数据分析实战-将dataframe某列的值分成不同区间并计算每个区间的频数(附源码和实现效果)

实现功能 将dataframe某列的值分成不同区间并计算每个区间的频数 实现代码 import pandas as pd# 创建dataframe data {Name:[Tom1, Jack1, Steve1, Ricky1, Tom2, Jack2, Steve2, Ricky2],Score:[78,60,59,42,88,34,69,142]} df pd.DataFrame(data) print(df)# 定义区间和…

Linux 部署1Panel现代化运维管理面板远程访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、…

el-form表单动态校验(场景: 输入框根据单选项来动态校验表单 没有选中的选项就不用校验)

el-form表单动态校验 el-form常规校验方式: // 结构部分 <el-form ref"form" :model"form" :rules"rules"><el-form-item label"活动名称: " prop"name" required><el-input v-model"form.name" /…

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述 【1】FlexFec 的保护方案 假设存在一组源数据包(D L)&#xff0c;其序列号从 1 开始运行到 D L 一维非交错行 FEC(1-D Non-interleaved Row FEC) : 一种连续的源数据包进行保护的方案&#xff0c;可用于恢复按行分组的源…

用Pycharm开发Flask框架设置debug模式、port 端口和 host 主机无效的解决办法

方法二 &#xff08;推荐&#xff09; Name 的选择请自行填写&#xff0c;随意。 这里笔者就默认 app 注意事项 需要以这个作为启动项&#xff0c;而不是原来的 flask 启动配置文件。 参考链接 1. 用Pycharm开发Flask框架设置debug模式没有效果的解决办法 2. flask中的de…

项目管理流程文件,招标支撑文件,项目研发,验收等系列支撑文件

写在前面&#xff1a; 我花了一些时间整理了这些年从事软件行业以来的文档&#xff0c;将它们分类整理后&#xff0c;电脑瞬间变得更加简洁。我整理了数百份软件开发过程中的常用文档&#xff0c;包括项目计划、立项计划、需求分析、概要设计、详细设计、数据库设计、用户操作手…

盘点3款超好用的免费录屏软件,快来看!

在现代数字化社会中&#xff0c;录屏软件成为了各行各业中必备的工具之一&#xff0c;用于记录操作步骤、制作教程、分享游戏精彩瞬间等。而寻找一款免费的、功能强大的录屏软件也变得越来越重要。本文将为您介绍3款免费录屏软件&#xff0c;并详细说明使用步骤&#xff0c;帮助…