京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Mysql5.7并发插入死锁题目解决

2024-11-2 22:42| 发布者: 8b79| 查看: 122| 评论: 0

摘要: 目录死锁的产生条件MySQL锁类型死锁复现死锁场景一:死锁场景二:制止死锁死锁的产生条件 互斥、哀求和保持、不可剥夺、循环等待 MySQL锁类型 死锁复现 情况:Mysql 5.7版本,Innodb引擎,可重复度隔离级别并发场景
目录

死锁的产生条件

互斥、哀求和保持、不可剥夺、循环等待

MySQL锁类型

在这里插入图片描述

死锁复现

情况:Mysql 5.7版本,Innodb引擎,可重复度隔离级别
并发场景下使用duplicate key update插入或更新数据可能会造成死锁,下面就产存亡锁的条件进行模拟
表:

[code]CREATE TABLE `song_rank` ( `id` int(11) NOT NULL AUTO_INCREMENT, `songId` int(11) NOT NULL, `weight` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `songId_idx` (`songId`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 [/code]

隔离级别:可重复度(RR)

[code]select @@tx_isolation; [/code]

在这里插入图片描述

预先插入两条数据

idsongIdweight
11030
22030

在这里插入图片描述

关闭事故自动提交:

[code]select @@autocommit; set autocommit=0; [/code]

在这里插入图片描述

死锁场景一:

记载锁循环等待:如果两个事故并发读写相偕行,会由于加锁时机的差别而造成死锁,导致其中一个事故实行失败(mysql可以配置自动检测死锁然后自动断开其中一个innodb_deadlock_detect)

[code]## 事故一 # 第一步实行 begin; insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1; # 第三步实行 insert into song_rank(songId,weight) values(16,100) on duplicate key update weight=weight+1; ## 事故二 # 第二步实行 begin; insert into song_rank(songId,weight) values(16,100) on duplicate key update weight=weight+1; # 第四步实行 insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1; [/code]
实行步骤事故一事故二锁状态
第一步begin; insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1;事故一对17新增记载锁
第二步begin;insert into song_rank(songId,weight) values(16,100) on duplicate key update weight=weight+1;事故二对16新增记载锁
第三步insert into song_rank(songId,weight) values(16,100) on duplicate key update weight=weight+1;事故一等待事故二释放16的记载锁
第四步insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1;事故二等待事故一释放17的记载锁,出现死锁

死锁场景二:

记载锁、间隙锁循环等待:在并发插入、更新同一条数据时,一个事故获取了记载锁,一个事故在等待记载排他锁,则事故在实行插入获取间隙锁是会造成死锁。

[code]# 事故一 # 第一步实行 begin; insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1; # 第四步实行 rollback; # 事故二 # 第二步实行 begin; insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1; # 事故三 # 第三步实行 begin; insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1; # 出现死锁 [/code]
实行步骤事故一事故二事故三锁状态
第一步begin; insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1;事故一对17新增记载锁
第二步begin;insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1;事故二等待17记载锁
第三步begin;insert into song_rank(songId,weight) values(17,100) on duplicate key update weight=weight+1;事故三等待17的记载锁
第四步rollback;事故二获取17记载锁,事故三等待17记载锁,事故一获取间隙锁时须要等待事故三释放17记载锁,出现死锁

制止死锁

控制并发写入和更新;
先实行插入,捕捉插入非常并处理更新数据;

到此这篇关于Mysql5.7并发插入死锁题目解决的文章就先容到这了,更多相关Mysql5.7并发插入死锁内容请搜索脚本之家从前的文章或继续浏览下面的相关文章渴望大家以后多多支持脚本之家!


来源:https://www.jb51.net/database/3271232ap.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 21:09 , Processed in 0.030556 second(s), 18 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部