一条sql造成死锁

一次 MySQL 线上死锁分析实战 前言 MySQL 的锁机制相信大家在学习 MySQL 的时候都有简单的了解过,那既然有锁就必定绕不开死锁这个问题。其实 MySQL 在大部分场景下是不会存在死锁问题的(比如并发量不高,SQL 写得不至于太拉胯的情况),但是在高并发的业务场景下,一不注意就会产生死锁,而这个死锁分析起来也比较麻烦。 前段时间在公司实习的时候就遇到了一个比较奇怪的死锁,之前一直没来得及好好整理,最近有空复现了一下,算是积累一点经验。 业务场景 简单说一下业务背景,公司做的是电商直播,我负责的是主播端相关的业务。而这个死锁 阅读详情

问题背景

 访问量增加,突然大量死锁报警,看日志是一条这样sql:
insert into tableName (uid,name) select ?,? from dual where not exists (select 1 from tableName where uid=? and name=?);
  uid,name有唯一索引。

知识点

这个问题有几个知识点:

  1. insert后面的select会当前读,隐式加锁
  2. 查询不存在,会降级为间隙锁
  3. 间隙锁查询不是互斥的,会造成死锁

案例分析

间隙锁死锁问题在这里插入图片描述
说明:
  不同于写锁相互之间是互斥的原则,间隙锁之间不是互斥的,如果一个事务A获取到了(5,10]之间的间隙锁,另一个事务B也可以获取到(5,10]之间的间隙锁。这时就可能会发生死锁问题,如下案例。
事务A获取到(5,10]之间的间隙锁不允许其他的DDL操作,在事务提交,间隙锁释放之前,事务B也获取到了间隙锁(5,10],这时两个事务就处于死锁状态。

查找sqlserver查询死锁源头的方法 sqlserver死锁监控 show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示。数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,查看当前进程,或死锁进程,并能自动杀掉死进程 --查看当前进程,或死锁进程,并能自动杀掉死进程。@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示。进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid, 阅读详情

相关推荐

《Ventoy 制作系统安装 U 盘的具体步骤》

然后您可以在电脑的磁盘管理中对 U 盘进行快速格式化,选择 FAT32 或 NTFS 文件系统。至此,Ventoy 系统安装 U 盘就制作完成了。您可以在需要安装系统的电脑上,从 U 盘启动,然后选择相应的系统镜像进行安装。安装完成后,将您需要的操作系统镜像文件(如 Windows、Linux 等的 ISO 格式镜像)复制到 U 盘的根目录。在安装程序中,选择您插入的 U 盘设备,确保选择正确,以免误操作。2. 确认选择的 U 盘盘符正确,防止误操作导致其他磁盘数据丢失。点击“安装”按钮,等待安装完成。

jiyiwangluokeji的博客 2668

数据库带条件的插入操作(防止添加相同名字的记录)

数据库带条件的插入操作(防止添加相同名字的记录)

但行好事,莫问前程 1433

Revit二次开发——不启动Revit,做rvt文件数据导出

Revit二次开发——不启动Revit,做rvt文件数据导出Node.js部分调用C#端供外部调用的dllC#部分调用RevitNet.dll,做数据导出exe做外部调用dll总结功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 N

Y.Jerome的专栏 4111

手工模拟SQL的死锁

今天看到数据库PPT上有个手工模拟死锁的SQL程序: --用户1:ok begin transaction t1; select * from test with (holdlock,xlock) where id=1; --用户2:OK begin transaction t2; select * from test with (holdlock,xlock) where id=2; -...

肥仔的博客 1786

IGBT模块封装中的银烧结技术:为什么特斯拉和比亚迪都在用这种黑科技?

本文深入解析了IGBT模块封装中的银烧结技术,揭示了其作为功率半导体封装工艺关键升级的原因。该技术通过低温烧结形成高熔点、高导热导电的银连接层,显著提升了模块的功率循环寿命、散热能力和高温工作稳定性,这正是特斯拉、比亚迪等行业巨头采用此项黑科技以释放电动汽车电驱系统极致性能的核心所在。

yhn4567890的博客 833

2、瑞丽-伯纳德对流的拉格朗日拟序结构(FTLE场结果对比)

在中,我简单比较了瑞丽伯纳德对流的FTLE场,但是因为粒子追踪采用的是欧拉方法,所以精度不是很高, 因此与文献中的结果还是有些差别。下面放一张文献中的FTLE场,参数与上篇文章是一致的,Ra = 1e8;Pr = 1;本文将详细的介绍如何得到这样的图片,好吧,其实也不是很详细。总之,先展示以下我个人的结果。可以看出,上图基本上与文献是一致的,因为这里展示的是瞬时场,所以当然不可能是完全一致,至于提取的LCS结构,我在下面也会提及。本着详细介绍的原则,所以这里我很良心的从流场计算开始介绍。

ambu1230的博客 1785

记录一次SQL插入出现死锁的情况及解决方式

由于插入的数据结构比较复杂,SQL插入进行了循环批量插入。数据结构如下: { "projectInfo":{ projectShortName:"项目001", projectId:"pro_001", projectType:"xxx", custFullName:"顺丰", certificateNo:"4567890876543" }, "ac":[ {

Matthew_99的博客 1041

告别双系统!用PhyFusion在麒麟V10上无缝融合Win11,文件互传、GPU加速全搞定

本文详细介绍了在飞腾D3000平台上使用PhyFusion实现麒麟V10与Win11无缝融合的解决方案。通过视觉无界、数据互通和性能无损的三大突破,PhyFusion显著提升了跨系统工作效率,支持GPU加速和文件互传,是国产化平台的革命性工具。

weixin_28707365的博客 1015

MySQL 语句级避免重复插入—— Insert Where Not Exist

      高并发得情况下,我们不想数据库产生多条相同数据得情况下,会理所当然得选择数据库乐观锁,查询一下是否存在,如果不存在,插入。        但是当存在多台服务器得时候,例如负载均衡,当一个客户端快速的重复的发起多次请求,这些请求分别被转发a,b两条服务器,这两台服务器再去使用查询一下是否存在,如果不存在,插入的逻辑,很显然会往库里存放两条一样的数据。         解决上述多服务器...

weixin_41609327的博客 8406

Python 爬虫项目:爬取百度贴吧帖子,保存标题与评论内容

在 Python 爬虫技术的学习与实战体系中,贴吧类动态内容爬取是典型的入门进阶案例,百度贴吧作为国内主流的社区论坛平台,其页面结构规范、数据载体清晰,非常适合用于巩固爬虫核心技术栈。本次实战项目基于requests请求库与解析库实现完整的爬取流程,从网页请求、数据解析、内容提取到本地持久化存储全链路落地,既能掌握基础爬虫的核心逻辑,也能理解网页结构化数据解析的通用思路,同时规避爬虫常见的反爬基础策略,具备极高的实战参考价值。本文核心价值。

2503_91057718的博客 2543

TC3XX - MCAL知识点(一):新建Tc3xx EB-tresos工程

基于EB-tresos建立Hightec或者Tasking工程的时候,第一个步骤就是需要新建一个EB-tresos的工程,本文记录一下如何新建一个EB-tresos工程,以及对其进行简单的操作。那么Tc3xx的MCAL包含哪些内容呢?

梦想技术家 2970

SQL SERVER中的两种常见死锁及解决思路

在sqlserver中,死锁都与一种锁有关,那就是排它锁(x锁)。由于在同一时间对同一个数据库资源只能有一个数据库进程可以拥有排它锁。因此,一旦多个进程都需要获取某个或者同一个数据库资源的排它访问权,而又被对方所阻止的时候,死锁就会出现。 第一种就是最经典的racecondition思路,两个数据库进程,a和b,则a进程中修改数据表t1(假设id=100),再修改数据表t2(假设id=...

weixin_30879169的博客 1366

读懂ARM汇编程序,你只差这篇!保姆级教程(附完整示例剖析)!

ARM汇编中的符号、标号、伪操作有哪些?C语言和汇编语言如何混合编程?GNU ARM汇编和ARM汇编的区别有哪些?

车载系统攻城狮 1万+

一条 sql 语句可能导致的表锁和行锁以及死锁检测

锁MDL当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁行锁两阶段锁协议死锁和死锁检测。

fanghailiang2016的博客 1413

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SQL优化改写之美——MySQL 一条SELECT死锁引发SQL优化思考

出问题的数据库版本为MySQL 5.1,表引擎为MyISAM,在业务SELECT查询的时候,居然与一条UPDATE语句相作用,触发了数据库的死锁问题。 具体问题如下: 在常规情况下,SELECT查询语句在MyISAM表引擎下是不会与UPDATE语句产生死锁,但数据库版本过旧,数据库存在未知且难以解决的BUG,尝试升级数据库版本和更改表结构引擎,业务SQL中出现许多错误的结果返回或反应数据库...

cai182081的博客 1572

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

一条sql的执行过程,锁和死锁及日志分析

一条查询sql的执行过程:首先sql产生后发送给sql接口,sql接口将这段sql转化为哈希值,第二步在缓存中查询是否有相同哈希值,有就直接返回结果集,没有进入下一步。//对id为一的数据加排他锁,同时未进行提交。正在执行的sql:update t_lock set name =’a31’ where id=1;正在执行的sql:update t_lock set name=’c3’ where id=3;共读了72行,修改了10行, 读表如远大于写表,可能说明有全表扫描,导致锁范围扩大(如间隙锁)。

m0_53356339的博客 171

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

mysql granted_一条简单SQL语句出现死锁情况,请帮忙各位大神帮忙分析一下。

该楼层疑似违规已被系统折叠隐藏此楼查看此楼小弟有一SQL语句现在在多并发的情况下会出现死锁,小弟技术小白,自己实在解决不了了。希望各位大神帮忙给小弟分析一下。UPDATE accountinfo SET usecnt = 20, version = version+1 WHERE usecnt > 0 AND accountid = 12 and version = 102其中accoun...

weixin_42467508的博客 305

记压测环境数据表死锁导致接口长时间pending问题

在浏览器中打开F12,复现问题,确定那个接口存在性能问题,接下来需要确定接口内部的实现逻辑是什么样,做了哪些事情,调用了哪些服务,分析接口存在性能问题的根本原因,在排查过程中,着重留意是否在for循环中执行数据库操作、调用第三方接口、调用第三方接口耗时,执行的SQL是否有性能问题。随后确定优化方案,验证效果发版。随版本迭代以及需求变更,接口中的逻辑可能越来越臃肿,关联查询的表越来越多,查询的数据量越来越大,为保证业务闭环,新增与更新可能要同时操作N张表,以上均是影响接口性能的因素。

FirstMrRight的博客 595

Mysql多索引引起死锁问题

本人原文地址:Mysql多索引引起死锁问题 之前在数据库中,发现一条sql语句会导致死锁,但是其中查询的键都加了索引了,这死锁从何而来呢? 于是去查看了sql语句和建表语句,如下: 一、问题 UPDATE eagle_riskcon_third SET msessage = ? , time = ? whe...

Ops的博客 2747

记录mysql查询死锁有用的sql

SELECTFROM。

pkmowang的博客 321

mysql 锁表 sleep_mysql sleep 死锁例子

表结构CREATE TABLE `orders` ( `order_id` int(11) NOT NULL, `order_addr` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;insert into ...

weixin_36080842的博客 555

oracle重复只显示一条,sql 实现记录有重复只显示一条。

sql 实现记录有重复只显示一条。col_1 col_2 col_3 col_4---------- ---------- ---------- ----------a 111 222 333a 11 22 33b 111 222...

weixin_29799209的博客 1757

查询并解除oracle的死锁的方法

查询死锁的语句:select t2.username||   ||t2.sid||   ||t2.serial#||   ||t2.logon_time||   ||t3.sql_text      from v$locked_object t1,v$session t2,v$sqltext t3      where t1.session_id=t2.sid       and

剑晖(广州)的专栏 1372

mysql事物超时回滚_Mysql死锁引起的事务未回滚问题

今天之前的同事问我,之前我负责的系统出现了MySQL异常,但是事务却没有回滚,事务前半部分执行的SQL在数据库能看到,日志信息如下org.springframework.dao.DeadlockLoserDataAccessException:### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTran...

weixin_30592887的博客 995

死锁的形成

互相持有对方的资源. 存在资源竞争都没有释放.

xiaozhengN的博客 268

记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理

昨晚我正在床上睡得着着的,突然来了一条短信。啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志。能清楚看到是这条insert语句发生了死锁。MySQL如果检测到两个事务发生了死锁,会回滚其中一个事务,让另一个事务执行成功。很明显,我们这条insert语句被回滚了。 但是我们怎么排查这个问题呢?到底跟哪条SQL产生了死锁?好在MySQL记录了最近一次的死锁日志,可以用命令行工具查看: 在死锁日志中,可以清楚地看到这两条insert语句产生了死锁,最终事务2被会回滚,事务1执行成功。 这两条insert

一灯架构的专栏 737
上一篇: MybatisPlus动态修改表名或增加库名
下一篇: 什么是真正的云原生 -- 应用视角
鲫鱼哥
博客等级 码龄10年 18粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值