MySQL阻塞与死锁

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.rhkb.cn/news/122658.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看…

两个类文件,实现根据返回的id显示对应的人员信息增强返回

后台与前台交互时,由于后台存放的原始信息可能就是一些id或code,要经过相应的转换才能很好地在前台展示。 比如: select id, user_id from user 直接返回给前台时,前台可能要根据你这个user_id作为参数,再请求一次后…

【方法】如何取消7Z压缩文件加密的密码?

给7Z格式的压缩文件设置了密码,后续又不需要了,如何取消呢?如果忘记密码,还能取消吗?下面小编来分享一下方法。 首先,我们需要使用支持7Z格式的解压缩软件,如果使用的是WinRAR或者7-Zip解压缩软…

Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

OceanBase社区版4.x核心技术解密

数字化时代,各行各业的数据量呈现爆发式增长,对于海量数据价值的挖掘和应用,正成为推动创新的主要力量,与此同时,数据计算复杂度正在提升。在此背景下,对于数据处理的基石数据库而言,正面临市场…

数学建模--非多项式拟合法的Python实现

目录 1.算法异同区别 2.算法核心步骤 3.算法核心代码 4.算法效果展示 1.算法异同区别 #*************************************************************************************************************# 方法区别探究 1.对于多项式拟合你需要大致知道这些点的分布&#xf…

jsvmp逆向(补环境篇)

书接上回 上篇文章写到tx的jsxmp的算法逆向,文章链接在这里。初试jsvmp加密 。但是可能有伙伴觉得不够详细。 这里放一个大佬的文章链接。 https://www.52pojie.cn/thread-1521480-1-1.html 。其实就是一个变形的xtea加密。 大佬的文章已经讲了很清楚了&#…

Spring MVC入门必读:注解、参数传递、返回值和页面跳转

一、常用注解 1.1.RequestMapping 作用:用于映射请求路径与处理请求的方法之间的关系,可以用在类或方法上 。 标注在方法上 用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法 Controller public class HelloContro…

Redis集群服务器

集群简介 试想有一家餐厅,如果顾客人数较少,那么餐厅只需要一个服务员即可,如图1。但是,当顾客人数非常多时,一个服务员是绝对不够的,如图2。此时,餐厅需要雇用更多的服务员来解决大量访问&…

Acwing算法心得——现代艺术(统计遍历)

大家好,我是晴天学长,先用两个一维数组维护数据,再统计遍历二维数组,需要的小伙伴请自取哦!💪💪💪 1 )现代艺术 2) .算法思路 现代艺术 1.两个数组维护行和列 2.遍历数组…

git在windows上安装

介绍git工具在windows上如何安装 git官网下载地址 1.1、下载 https://github.com/git-for-windows/git/releases/download/v2.36.0.windows.1/Git-2.36.0-64-bit.exe自行选择版本,这里我选择的是 Git-2.36.0-64-bit这个版本 1.2、安装 安装路径选择英文且不带空格…

Vue组件之间传值

聊一聊vue里面组件之间的传值 首先总结一下vue里面传值的几种关系: 如上图所示, A与B、A与C、B与D、C与F组件之间是父子关系; B与C之间是兄弟关系;A与D、A与E之间是隔代关系; D与F是堂兄关系,针对以上关系 我们把组件…

Java中级面试题记录(三)

1.职业规划? 2.每家公司离职原因? 3.SpringCloud用到了哪些组件? GateWayNacosOpenFeignSeataHystrix 4.PG和Mysql的区别? 5.两种数据库的存储区别? 6.MySQL索引了解的内容? 一口气搞定索引的所有知识…

uniapp 解决跨域的问题

uniapp 解决跨域的问题 我真的是个 沙雕 找对了解决办法 写错了地方 "h5" : {"devServer" : {"disableHostCheck" : true,"https": false,"proxy" : {"/app" : {"target" : "https://192.16…

算法的时间复杂度

算法的时间复杂度 ⭐算法效率⭐时间复杂度🌟时间复杂度🐟时间复杂度的概念🐳例1 🐟大O的渐进表示法🐳 例2🐳例3🐳例4🐳例5🐳例6🐳例7 ⭐算法效率 如何衡量一…

支付宝pc支付(springboot版),简单配置即可实现支付

概述 支付宝pc支付,只需要修改配置就可以实现支付,0基础小白都可以用。使用springboot编写,简单易用。 详细 DEMO简介 springboot整合支付宝pc支付,仅仅需要少量的配置,就可以实现pc支付。 项目截图 支付流程 用户…

sql:SQL优化知识点记录(十一)

(1)用Show Profile进行sql分析 新的一个优化的方式show Profile 运行一些查询sql: 查看一下我们执行过的sql 显示sql查询声明周期完整的过程: 当执行过程出现了下面这4个中的时,就会有问题导致效率慢 8这个sql创建…

数学建模--Topsis评价方法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ TOPSIS(综合评价方法):主要是根据根据各测评对象与理想目标的接近程度进行排序. 然后在现有研究对象中进行相对优劣评价。 其基本原理就是求解计算各评价对象与最优解和最劣解的距离…

【力扣每日一题】2023.9.5 从两个数字数组里生成最小数字

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们两个数字数组,要我们用这两个数组里的元素组成一个数字,这个数字里需要同时拥有两个数组里的至少一个元…

uniapp移动端地图,点击气泡弹窗并实现精准定位

记录移动端地图map组件的使用 需求记录: 移动端地图部分需要展示两个定位点,上报点及人员定位点。通过右上角的两个按钮实现地图定位。点击对应定位气泡,弹出定位点的信息。 效果图如下: map在nvue中的使用。直接用nvue可以直接…