记一次排查线上MySQL死锁过程,不能只会curd,还要知道
昨晚我正在床上睡得着着的,突然来了一条短信。
啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志。
能清楚看到是这条insert语句发生了死锁。
MySQL如果检测到两个事务发生了死锁,会回滚其中一个事务,让另一个事务执行成功。很明显,我们这条insert语句被回滚了。insertintouser(id,name,age)values(6,张三,6);
但是我们怎么排查这个问题呢?
到底跟哪条SQL产生了死锁?
好在MySQL记录了最近一次的死锁日志,可以用命令行工具查看:showengineinnodbstatus;
在死锁日志中,可以清楚地看到这两条insert语句产生了死锁,最终事务2被会回滚,事务1执行成功。事务1insertintouser(id,name,age)values(5,张三,5);事务2insertintouser(id,name,age)values(6,李四,6);
这两条insert语句,怎么看也不像能产生死锁,我们来还原一下事发过程。
先看一下对应的Java代码:OverrideTransactional(rollbackForException。class)publicvoidinsertUser(Useruser){UseruserResultuserMapper。selectByIdForUpdate(user。getId());如果userId不存在,就插入数据,否则更新if(userResultnull){userMapper。insert(user);}else{userMapper。update(user);}}
业务逻辑代码很简单,如果userId不存在,就插入数据,否则更新user对象。
从死锁日志中,我们看到有两条insert语句,很明显userId5和userId6的数据都不存在。
所以对应的SQL执行过程,可能就是这样的:
先用forupdate加上排他锁,防止其他事务修改当前数据,然后再insert数据,最后发生了死锁,事务2被回滚。
两个事务分别在两个主键ID上面加锁,为什么会产生死锁呢?
如果看过上篇文章,就会明白。
当id5存在这条数据时,MySQL就会加RecordLocks(记录锁),意思就是只在id5这一条记录上加锁。
当id5这条记录不存在时,就会锁定一个范围。
假设表中的记录是这样的:
id
name
age
1hr王二
1hr10hr一灯
10selectfromuserwhereid5forupdate;
这条select语句锁定范围就是(1,10〕。
最后两个事务的执行过程就变成了:
通过这个示例看到,两个事务都可以先后锁定(1,10〕这个范围,说明MySQL默认加的临键锁的范围是可以交叉的。
那怎么解决这个死锁问题呢?
我能想到的解决办法就是,把这两个语句select和insert,合并成一条语句:insertintouser(id,name,age)values(5,张三,5)onduplicatekeyupdatename张三,age5;
大家有什么好办法吗?
这个死锁情况,还是挺常见的,赶紧回去翻一下项目代码有没有这样的问题。
推荐阅读:《我爱背八股系列》为什么要用MQ?MQ的作用有哪些?
高并发场景下,如何保证数据的一致性的?
如何进行分库分表?分库分表后有哪些问题以及对应的解决方案。
高并发下怎么生成订单ID?以及每种方案的优缺点。
如何实现分布式锁?使用数据库、分布式数据库、分布式协调服务分别如何实现?
MySQL索引底层数据结构为什么要用B树?以及红黑树、B树的优缺点。
一篇文章讲清楚MySQL的聚簇联合覆盖索引、回表、索引下推
ThreadLocal线上故障复盘,差点丢了工作。
详解MySQL事务底层原理
一文讲清楚MySQL的所有锁
MySQLupdate语句加锁过程和原理
红星快乐营星期五我听老师说19号我们要去大兴的红星快乐营,我有些高兴的心情:下周一去野外玩去了!回到家,我立马跟妈妈说这件事的基本的要求。到了19号,也就是今天,我校师生一起乘大巴……
最新家庭净收入4大等级,9大层次,层次越高,收入越高家庭年收入净值是指家庭总收入减去总支出,剩余收入,有些家庭年收入净值为正数,有些为负数。家庭年收入净值决定了一个家庭抗风险能力。按照年收入净值数量、抗风险能力和社会地位,……
爱,无言六年级作文看着墙上精美的日历,我不由自主地心头一震一年一度的母亲节到了。我的妈妈是一位聋哑人。她虽然身有疾,但她对我无微不至的爱,却丝毫没有缺憾。在我年幼的岁月里,她为我付出了太多……
年华议论文虚度年华着几个字眼刺痛了泪腺。当一个人无法主宰自己的思维时,他所想做的,徒有茫然等待。我辗转于十几个春秋,却也很难用切确的言语来表达出自己收获多少硕果。这算不算虚度……
医生忠告西红柿炒鸡蛋,尽量不要放此物,看一下你做对了吗?西红柿炒鸡蛋是每家每家每户餐桌必不可少的一道菜。鸡蛋和西红柿有很好的营养价值,结合一起不但能够给身体提供营养,味道十分鲜美,深受大家的喜欢。这道菜看似简单,但方法十……
人工智能可能替代医生吗?随着科技的快速发展,人工智能在医学领域的进步也是日新月异,有了非常不俗的表现,如临床诊断数据分析,远程医疗等等。因此,不少网友就提出了未来人工智能会不会替代医生?。个人觉……
肩周炎,不用怕!李医生一招搞定,扫除疼痛对很多中年人来说,肩周炎是一种很常见的,也是很折磨人的一种疾病,尤其是长期从事体力劳动的人,肩膀疼起来的时候,动一下就会有钻心之痛,很是苦恼,那么肩周炎是是怎么形成的呢,又该如……
什么油不健康?大豆油?医生提醒真正对人体有害的是这3种油俗话说得好:民以食为天。中国人对饮食的执着,受到中国地大物博、民族众多的影响,我国居民已经形成了极其独特和复杂的饮食习惯,且出现了各种不同的美味食物。但无论食物怎么变化,……
浙江最富的鄞州区主政官员落马,宁波官场余震未消《中国经济周刊》记者张宇轩宁波官场震荡还在继续。5月7日,浙江省纪委监委发布消息,宁波市委原常委、鄞州区委原书记褚银良涉嫌严重违纪违法被浙江省纪委监委审查调查。……
时间定了!油价再次调整5月30日24时国内成品油价或再迎上调暂预计汽、柴油价每吨上调350元左右折合92汽油、0柴油每升分别上调0。27元、0。30元新华社石油价……
广东最有钱的家族一家人都是老总,1345亿家族产业却无人继承我国经济自从改革开放之后,就获得了飞跃性的增长,其增长速度甚至位于全世界第一。在其中,广东省扮演了一个重要的角色,作为一个老牌经济大省,广东省为全国的GDP贡献了足够的数值。……
常住人口增量断崖下跌,广州性价比之王优势还能延续吗?2021年,广州常住人口仅增长7万,是十年来最低增量,作为一线城市中最具性价比的城市,从人口增势来看,广州性价比之王的优势正在急剧衰退。2021年常住人口仍然在增长,又不……
斯蒂芬A杜兰特离开库里选欧文是个错误,但勇士当初确实需要KDESPN名嘴斯蒂芬A史密斯在最近的一期电视节目中,谈到了勇士如果再次夺冠,勇士后卫斯蒂芬库里和篮网前锋凯文杜兰特的历史地位问题。斯蒂芬A表示:他(库里)的生涯履历已经超过……
省运进奥体甘肃省第十五届运动会本周兰州奥体中心开赛项目预告5月31日起,甘肃省第十五届运动会将有9个项目在本周陆续开赛。其中:群众组中国象棋比赛、群众组围棋比赛、群众组桥牌比赛、群众组体育舞蹈比赛、群众组网球比赛共5个项目将在兰州奥体……
精华端午节的习俗作文400字八篇在日常学习、工作和生活中,大家最不陌生的就是作文了吧,借助作文可以宣泄心中的情感,调节自己的心情。怎么写作文才能避免踩雷呢?以下是小编整理的端午节的习俗作文400字8篇,欢迎阅……
染料行业疲态已现?龙头企业带头忙转型近日,中国染料工业协会秘书处发布行业调研信息时指出,染料行业已出现严重的产能过剩,呼吁并建议染料企业减少产量,合理限产,避免恶意压低价格,引发行业强烈关注。作为全球行业的龙头,……
充满谎言和虚伪的世界作文精选这个世界充满着谎言和虚伪,真是让人憎恶和不耻。今天小编就来分享充满谎言和虚伪的世界作文,请各位读者好好欣赏和借鉴。充满谎言和虚伪的世界作文(一)谎言:假话,欺骗之言……
火箭又有新动作,试训潜力新人2022年NBA选秀大会即将到来,很多球队这段时间正忙着考察新人,火箭也不例外。据美媒报道,火箭本周将试训肯德尔布朗和尼古拉约维奇、比彻姆等多位球员。他们各有特点。……
oracle11g等保测评简单分享下我在工作中,遇到的oracle数据库的等保测评,以下几点是比较常见的漏洞扫描,也是我在项目运维中经常需要解决的漏洞:1、要求设置不能重复使用密码,并且设置密码有……
新势力销量出炉4家车企破万,但不包括蔚来蔚来6月1日是儿童节,同样也是各大车企交付上个月成绩单的时候。截止目前,造车新势力们纷纷晒出成绩单。从销量表现来看,造车新势力明显优于上月,甚至有几家新势力销量突破了一万……
每人每年可能吃2。8公斤地沟油?院士领衔,用小酵母解决大问题23岁,因为与导师叶开沅共同创立适于求解非线性微分方程的修正迭代法,他声名鹊起。28岁,他依靠手算完成了可用于测量飞机飞行高度的波纹圆板研究,将误差控制于1之内,完全可供……
真我GTNeo3轻度上手使用感受使用感受仅代表个人,请不要喷我。优点如下:1。快充顶:150w感知非常强,有我用iqoo5pro的感觉了。2。续航顶:是我用过的智能手机里最顶的,A30系统,……
难忘的大扫除作文400字星期天的早上,我在家里看电视,家里安静极了。突然,我仿佛听到了什么声音,我竖起耳朵细细地听,原来是地板在说话。地板小声地向我抱怨着:ldquo;小主人,你的脸多白呀,可是……
向妈妈认错的作文范文曾经,有一个小女孩,她有不会的题目就一定会去请教妈妈。妈妈,妈妈,你快办我看看这道题嘛!女孩撒娇地说道。每当此时,妈妈总是耐心、细致地为女孩解答。喏,你看这谢谢妈妈。于是……