MySQL阻塞与死锁

news2024/11/25 11:58:39

MySQL阻塞与死锁

阻塞

因为不同锁之间的兼容性关系,在有些时刻一个事务中的锁需要等待另一个事务中的锁释放它所占用的资源,这就是阻塞。

# 查看等待时间
show variables like 'innodb_lock_wait_timeout';
SET@@innodb_lock_wait_timeout=60;
# 是否在等待超时时对进行中的事务进行回滚操作
show variables like 'innodb_rollback_on_timeout';

#设置等待时间  默认50秒
SET@@innodb_lock_wait_timeout=60;  
#设置是否在等待超时时对进行中的事务进行回滚操作  默认是OFF 代表不回滚
SET@@innodb_rollback_on_timeout=on;

查询:

image-20230814102157758

设置值:

image-20230815165901211

注意:参数innodb_lock_wait_timeout 参数是动态的,在mysql运行时可进行调整,innodb_rollback_on_timeout参数是静态的,不可在运行时进行修改,否则会报错。

需要特别注意:在默认情况下InnoDB存储引擎不会回滚超时引发的错误异常。(其实InnoDB存储引擎在大部分情况下都不会对异常进行回滚。)

异常实例演示:

左边为会话A,右边为会话B。初始状态数据库表film中有3条数据,ID,分别为3,5,6;

首先会话A 开启了事务A,并且在Next-Key Lock算法下锁定了小与5包含5的记录。事务B正常插入记录ID:7,当插入ID:4 时就进人阻塞状态了

image-20230815174128914

当事务B达到事务超时间时间时,报错ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction.

image-20230815174608612

这时事务B在此查询会发现,**ID:7 这条记录依然存在,这是因为事务B虽然抛出了异常,但是既没有进行commit 操作也没有进行 rollback操作。**这是非常危险的,因为此时数据库一致性特性被打破了。因此此时用户必须判断是否需要COMMIT还是ROLLBACK,之后再进行下一步的操作。

image-20230815175103979

一般情况这时事务B需要进行 rollback操作,具体情况具体分析。

image-20230815175620413

死锁

死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。

当发生死锁的时候,若无外力作用事务都将无法进行下去。

死锁产生的条件:

  • 互斥条件
    临界资源是独占资源,进程应互斥且排他的使用这些资源。
  • 占有和等待条件
    进程在请求资源得不到满足而等待时,不释放已占有资源。
  • 不剥夺条件
    又称不可抢占,已获资源只能由进程自愿释放,不允许被其他进程剥夺。
  • 循环等待条件
    又称环路条件,存在循环等待链,其中,每个进程都在等待链中等待下一个进程所持有的资源,造成这组进程处于永远等待状态。

如何解决死锁问题:

1.超时机制:当两个事务互相等待时,如果等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。在InnoDB存储引擎中,innodb_lock_wait_timeout设置超时的时间。

我们知道,一条记录是有很多undo log的或者undo 版本链有很多版本的,如果一个事务操作更新了很多行,这时候如果要进行回滚所占用的时间可能就会很多。

2.使用wai t-for graph (等待图)进行死锁检测,数据库需要保存锁的信息链表和事务等待链表。我们通过锁的信息链表和事务等待链表就可以构造出一张图,如果图中存在回路那就说明出现了死锁。

image-20230815235528149

​ 事务和锁状态图

上图中,transaction wait list 中有四个事务,事务t2对row1加了x锁,事务t1对row1加了s锁,并且事务t1需要等待事务t2中的row1资源,因此wait-for graph图中有一条边冲节点t1指向t2。 row2记录的情况同理。

image-20230816001239711

​ wait-for graph

观察发现,t1 和 t2 存在回路,因此存在死锁。

阅读到这里,我们需要意识到因为MySQL数据库是一个并发的程序,所以才存在死锁。因为如果程序是串行的,那么也就不会发生死锁了。

死锁示例:

有两个事务A,B: 事务A当前读查询记录ID:5 ,事务B当前读查询ID:6。

image-20230816002539299

接着交换一下:

事务A当前读查询记录ID:6 ,事务B当前读查询ID:5

image-20230816003007483

会发现两个事务中的事务B立马就报错:ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

通常来说InnoDB存储引擎选择回滚undo量最小的事务。

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

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

相关文章

深度学习面试八股文(2023.9.06持续更新)

一、优化器 1、SGD是什么? 批梯度下降(Batch gradient descent):遍历全部数据集算一次损失函数,计算量开销大,计算速度慢,不支持在线学习。随机梯度下降(Stochastic gradient desc…

【HTML/CSS】入门导学篇

本文属于HTML/CSS专栏文章,适合WEB前端开发入门学习,如果有所帮助请一键三连支持,对博主系列文章感兴趣点击下方专栏了解详细。 本文内容出自B站pink老师的前端入门教程,感谢pink老师!!! 视频链…

【ARM CoreLink 系列 1 -- CoreLink 系列 产品介绍】

文章目录 ARM CoreLink 介绍ARM CoreLink InterconnectARM CoreLink 处理器外设ARM CoreLink Memory Controllers ARM CoreLink 介绍 ARM的CoreLink系列产品是一套能够进行高效互联的组件和工具,它们用于构建高性能、低功耗的嵌入式和消费电子设备。CoreLink产品系…

Mac MySQL初始登录root报错access denied解决方法

如图,当在mac m2上首次安装mysql后尝试登录root用户时,无论输入什么样的密码,或者直接回车键,都会显示access denied for user rootlocalhost。同时win和ubuntu也出现了一模一样的问题,先记录一下mac的解决方法。 参考…

Sigrity仿真报错:找不到电容的S参数?

很多电子工程师会选择使用Sigrity软件进行高速PCB信号仿真,但在使用过程可能会遇见报错情况,其中之一是提示找不到电容的S参数,那么如何解决这个问题? 一般来说,S参数的全称为Scatter参数,即散射参数&#…

STM32单片机OLED贪吃蛇游戏记分计时

实践制作DIY- GC00165---OLED贪吃蛇游戏 一、功能说明: 基于STM32单片机设计---OLED贪吃蛇游戏 二、功能说明: STM32F103C系列最小系统板0.96寸OLED显示器上、下、左、右4个按键 1.通过OLED配合按键实现贪吃蛇游戏 2.可以上下左右移动。 3.可以统计显…

JavaScript-----DOM元素

目录 前言: 1. DOM介绍 2. 获取节点 3. 操作HTML内容 4. 监听事件 案例 5. 操作节点的标签属性 6. 操作样式 7. 创建、添加、删除节点 前言: 在此之前我们要想去操作网页元素一般是去通过CSS选择器实现的,今天我们就学习JavaScript里…

bit、bin 、mcs文件区别

FPGA里面的可执行文件都涉及到 *.bit, *.mcs, *.bin 和 *.elf。 bit文件 bit 文件一般用于JTAG在线进行调试的时候,是把bit文件是烧写到FPGA中进行在线调试。 bin文件 bin 文件是二进制文件,按顺序只包含原始字节流&#xff0c…

74HC595

简介 74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三 态输出(即高电平、低电平和高阻抗) 15 和 1 到 7 脚 QA--QH:并行数据输出 9 脚 QH 非:串行数据输出 10 脚 SCLK 非( MR&#…

【UE 材质】制作飘动的旗帜

效果 步骤 1. 首先在建模软件中创建一个平面,注意分段数一定要多 2. 在UE中创建一个材质,这里命名为“Mat_Flag” 打开“Mat_Flag”,先将旗帜纹理连接到基础颜色 先选中导入的模型然后点击根据选中的模型预览材质 创建如下节点可以看到此时模…

本地开发环境大小写不敏感引发的问题

推荐阅读 大小写敏感知多少[1] 文件大小写与文件系统有关,与操作系统无关。 血泪教训--拿到新移动硬盘该做的第一件事[2] MacOS 默认的文件系统APFS,如果没有手动更改,默认不区分大小写(可以在初始化时设置为大小写敏感)。 而公司测试/生产环…

AOSP和AAOS,向左走还是向右走?

Android Automotive OS(AAOS)和Android Open-Source Project(AOSP)之间存在很多混乱。这两个Android版本经常被混淆使用,但它们代表不同的平台和方法。为汽车In-Vehicle Infotainment(IVI)项目选…

2023CSP-S初赛复习整理

目录 逻辑运算常见运算运算规则运算优先级例题 进制转换十进制转二进制、八进制、十六进制二进制、八进制、十六进制转十进制例题 主定理编程语言概况具体分类 逻辑运算 常见运算 非: n o t not not 即 与: a n d and and 即 ∧ ∧ ∧ 或&#xf…

依赖项的处理与层的创建与注册

依赖项的处理与层的创建与注册 依赖项的处理与层的创建与注册 新问题什么是 layer?layer 的创建与注册 与函数同时创建和绑定单独上传 layer 再绑定函数(推荐) 真正的运行时依赖 注册包的约定与平台强关联的运行时 1. 云端安装依赖2. 本地构建 Amazon Linux 2 容器环境3. 利用…

Nginx__高级进阶篇

目录 Nginx Web服务器 Nginx Proxy服务器 Nginx 邮 件 Nginx Web服务器 Nginx Proxy服务器 代理原理 正向代理:内网客户机通过代理访问互联网。通常要设置代理服务器地址和端口。 反向代理:外网用户通过代理访问内网服务器。内…

解决VSCode下载速度特别慢

背景: 我们在vscode官网下载vocode的时候速度慢得离谱,而且下载会断开,这时候我们需要将下载镜像切换到国内! 解决方法 我是用chrome浏览器,点击右上角的三个点按钮,点击下载内容。 如果你是用其他浏览器,可能使用其他方式跳…

“深入理解SpringMVC的注解驱动开发“

目录 引言1. SpringMVC的常用注解2. SpringMVC的参数传递3. SpringMVC的返回值4. SpringMVC页面跳转总结 引言 在现代的Web开发中,SpringMVC已经成为了一个非常流行和强大的框架。它提供了许多注解来简化开发过程,使得我们能够更加专注于业务逻辑的实现…

设置windos电脑开机自动启动chrome浏览器,并且打开指定网页

需求 web项目设置windos电脑开机自动启动chrome浏览器,打开指定网页地址,并设置为全屏显示 解决 使用windos的bat脚本,设置为开机自启动,代码如下 echo off cd /d %~dp0 title Chrome tasklist|find /i "chrome.exe"…

Hadoop的第二个核心组件:MapReduce框架第三节

Hadoop的第二个核心组件:MapReduce框架 九、MR程序运行的核心阶段的细节性知识1、MR程序在运行过程中,涉及到的阶段和作用2、MR程序运行的的第一个组件:InputFormat3、MR程序的Job提交流程的源码分析4、MR程序运行中Mapper组件的作用5、MR程序…

【IC设计】Chisel开发环境搭建

首先安装一个Ubuntu的虚拟机 然后给Ubuntu换个镜像,方便下载 注意换源后使用apt-get update更新下 安装vim(可以不做) 这里安装Vim是我感觉Ubuntu自带的vi编辑器似乎有问题,因为我按i进入【插入模式】并没有提示,所以…