MySQL 死锁排查

现象

发生死锁,服务会出现如下报警,

Deadlockfound when trying to get lock; try restarting transaction。

思路

出现类似问题,应先评估死锁对业务和数据的影响范围。如果有损,选择合适的止损方式,然后再去分析解决问题。

1. 查服务日志和 MySQL 死锁日志,定位死锁发生地

2. 分析代码,定位死锁原因

一般有了服务和 MySQL 死锁日志,就很容易定位到代码死锁发生地,看代码分析逻辑就行了。

3. 复现一个死锁 case(间隙锁非互斥)

一般死锁都是因为多个事务并发操作数据库造成的,确定数据库隔离级别:RR;

本地安装 MySQL,构造死锁测试数据(数据纯属构造,如有雷同,纯属巧合),去复现下,

注:1235905358376715619,比它小一个的是1235697761479571791,比它大一个的是1242077848279131794。
原因,间隙锁非互斥,UPDATE table SET user_id = null WHERE user_id = #{userId},这条语句本身就容易产生间隙锁死锁问题,最好增加 flag 标志来标识记录状态。
分析,
1、先开启事务一,然后执行更新 user_id = 1235905358376715619 的数据,user_id = 1235905358376715619 这条记录不存在,说明它会在 1235697761479571791-1242077848279131794 之间加间隙锁;
2、开启事务二,然后也执行更新 user_id = 1235905358376715619 的数据,事务二也会对 1235697761479571791-1242077848279131794 之间加间隙锁;
3、此时我们需要做的操作就是让事务一在 1235697761479571791-1242077848279131794 之间插入或更新数据,会发现此时事务已经被阻塞,无法执行insert/update,因为事务二已经对该区间加了间隙锁;

4、在事务一等待锁的同时,让事务二同时在 1235697761479571791-1242077848279131794 之间插入数据,这个时候会发现,只要事务二一旦执行 insert/update,立即报了死锁。

总结

  1. 类似两次加排他锁的线性更新操作,先用悲观锁查询,如果存在更新;不存在保存,不用更新。比如分布式锁防抖动,可以优先解决重放并发导致的死锁问题,缺点是锁操作较重;
  2. 不要频繁更新索引字段,最好使用 id 来单条更新记录,更新时锁的范围会变小;
  3. 不要执行批量大事务,批量大事务,会占用大锁,存在并发时,就会有死锁。有条件的话,一条一条插入/更新;如果非要批量插入数据,可以执行批量 insert SQL,保证原子性(insertBatch);批量保存时,最好按照索引字段排序后,再保存。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.linux中调度kettle

一.准备转换,等会在linux中用 1.添加excel输入组件,并添加对应的文件 2.添加列拆分为多行组件 3.添加文本文件输出组件 4.保存转换 二.linux安装java 1.把jdk-8u144-linux-x64.tar.gz上传到linux的/lx目录下 2. 解压jdk包,然后配置环境变量…

2025澄迈漓岛音乐节品牌招商大会成功举行

——共谋音乐盛事,携手推动文化经济发展 12月6日,“2025澄迈漓岛音乐节品牌招商大会”(以下简称“招商大会”)在澄迈举行。本次大会由澄迈福山发展有限公司、福山咖啡文化风情镇旅游区联合主办,海南绿发投资有限公司承…

华为关键词覆盖应用市场ASO优化覆盖技巧

在我国的消费者群体当中,华为的品牌形象较高,且产品质量过硬,因此用户基数也大。与此同时,随着影响力的增大,华为不断向外扩张,也逐渐成为了海外市场的香饽饽。作为开发者和运营者,我们要认识到…

【深度学习】手机SIM卡托缺陷检测【附链接】

一、手机SIM卡托用途 SIM卡托是用于固定和保护SIM卡的部件,通过连接SIM卡与手机主板的方式,允许设备访问移动网络,用户可以通过SIM卡进行通话、发送短信和使用数据服务。 二、手机SIM卡托不良影响 SIM卡接触不良,造成信号中断&…

Flask使用长连接

Flask使用flask_socketio实现websocket Python中的单例模式 在HTTP通信中,连接复用(Connection Reuse)是一个重要的概念,它允许客户端和服务器在同一个TCP连接上发送和接收多个HTTP请求/响应,而不是为每个新的请求/响…

APSYN140频率综合器/频率源模块的输出功率设置范围在实际应用中有什么优势?

APSYN140频率综合器模块的输出功率设置范围从-10dBm至20dBm。 APSYN140-X系列多通道相参频率合成器--四通道输出43.5GHz 在实际应用中具有以下优势: 1. 适应不同应用需求 宽广的输出功率范围从100kHz至40GHz(9kHz至43.5GHz可设)使得APSYN14…

NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化

论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息: 简介: 本文的背景是基于人类语言理解的组合性特征,即语言处理本质上是层次化的:语法规则将词级别的意义组合成更大的成分的意义&…

RISC-V架构下OP-TEE 安全系统实践

安全之安全(security)博客目录导读 本篇博客,我们聚焦RISC-V 2024中国峰会上的RISC-V和OP-TEE结合的一个安全系统实践,来自芯来科技桂兵老师。 关于RISC-V TEE(可信执行环境)的相关方案,如感兴趣可参考RISC-V TEE(可信执行环境)方案初探 首…

车载VR可视化解决方案

车载VR可视化解决方案是通过融合跟踪用户头部运动的特殊预测算法与惯性测量数据而开发的。该系统将大范围虚拟现实跟踪技术与IMU传感器相结合,为VR和AR应用打造了一套全面的运动跟踪与渲染流程,极大地方便了虚拟现实头显制造商定制可视化流程。 该车载VR…

Git常用的命令【提交与回退】

git分布式版本控制系统 (SVN集中式版本控制系统)之间的对比 git有本地仓库和远程仓库,不同的开发人员可以分别提交自己的本地仓库并维护代码的版本控制。 然后多个人员在本地仓库协作的代码,可以提交到远程仓库中做整合。 git本…

【vue2自定义指令】v-disabled 实现el-switch,el-button等elementUI禁用(disabled)效果

如果你搜过类似的功能,肯定看到过千篇一律的 // 实现按钮禁用el.disabled true// 增加 elementUI 的禁用样式类el.classList.add(is-disabled)但是这个方案明显对el-switch,不起作用,所以我这边直接把方案贴出来,不想了解具体原理…

使用数据库同步中间件DBSyncer实现不同数据库的数据同步

点击上方蓝字关注我 有去O(ORACLE数据库)、信创、国产化数据库等项目实践的同学应该都遇到过不同数据库之前进行数据迁移的问题,虽然有各种工具可以实现,但是有些工具的部署、使用比较复杂,也有些工具迁移数据效率很低。本文将介绍一款开源且…

3.2 串口_HAL库实现代码

1、串口用作调试 串口用作调试就是配置好串口后,用串口做一些输出。对于代码层面,最终调用的是标准库printf来实现串口数据的输出。 1.1 CubeMX配置 1、RCC配置外部晶振 2、时钟树配置如下 3、工程配置如下 4、串口配置如下 注意这里默认设置的波特率…

乌龟咬人,小意外中的大警示

近日,听闻有朋友被自家乌龟咬了手指,这看似滑稽的小意外,实则蕴含着不少值得我们深思的安全与责任问题。 乌龟,在大众的认知里,向来是行动迟缓、性情温和的宠物代表。它们慢悠悠地爬行,憨态可掬的模样常常…

AI赋能:构建安全可信的智能电子档案库

在档案的政策与法规上,《中华人民共和国档案法》2020年修订新增,对电子档案的合法要件、地位和作用、安全管理要求和信息化系统建设等方面作出了明确规定,保障数字资源的安全保存和有效利用。 日前,国家档案局令第22号公布《电子…

解谜类游戏《迷失岛2》等如何抽象出一套通用高效开发框架?

解谜类游戏以精妙的谜题设计和引人入胜的故事叙述为特点,考验着玩家的智慧与观察力。《迷失岛2》与《南瓜先生2九龙城寨》正是这一领域的佳作。游戏以独特的艺术风格和玩法设计吸引了大量玩家,而它们背后隐藏着一套强大的框架。 上海胖布丁游戏的技术总…

使用ALB实现gRPC协议的负载均衡

gRPC是一种高性能、开源的远程过程调用框架,当您使用gRPC进行后端服务通信时,您可使用应用型负载均衡ALB(Application Load Balancer)实现gRPC协议的负载均衡,统一流量入口。gRPC基于HTTP/2协议进行通信,目…

JUC:Synchronized和锁升级

1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理,monitor对象什么时候生成的?知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛?或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…

ros项目dual_arm_pick-place(对比moveit配置助手生成的文件)

目录 前言正文gazebo_controllers.yaml变更ros_controllers.yaml变更simple_moveit_controllers.yaml变更moveit_planning_execution.launch变更ros_controllers.launch变更其他文件 汇总总结 前言 在本专栏前文中讲到,作者有moveit配置助手导出的包marmbots&#…

【力扣】13.罗马数字转整数

问题描述 思路解析 对于这种限制字符的问题&#xff0c;使用Map来对键值存储 对其进行判断&#xff0c;如果前面的数小于后面的数&#xff0c;那么结果相减 否则&#xff0c;正常相加。 代码 class Solution {Map<Character,Integer> mapnew HashMap<Character,In…