当前位置: 首页 > news >正文

Mysql5.7并发插入死锁问题

死锁的产生条件

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

MySQL锁类型

在这里插入图片描述

死锁复现

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

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

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

select @@tx_isolation;

在这里插入图片描述

预先插入两条数据

idsongIdweight
11030
22030

在这里插入图片描述
关闭事务自动提交:

select @@autocommit;
set autocommit=0;

在这里插入图片描述

死锁场景一:

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

## 事务一
# 第一步执行
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;
执行步骤事务一事务二锁状态
第一步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的记录锁,出现死锁

死锁场景二:

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

# 事务一
# 第一步执行
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;
# 出现死锁
执行步骤事务一事务二事务三锁状态
第一步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记录锁,出现死锁

避免死锁

控制并发写入和更新;
先执行插入,捕获插入异常并处理更新数据;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • #### golang中【堆】的使用及底层 ####
  • 【机器学习】机器学习与时间序列分析的融合应用与性能优化新探索
  • python库 - sentencepiece
  • 漏洞挖掘 | 记某证书站任意账号接管漏洞
  • 鸿蒙语言基础类库:【@ohos.util.TreeSet (非线性容器TreeSet)】
  • react根据后端返回数据动态添加路由
  • ElasticSearch集群
  • 【React Native优质开源项目】
  • 32位版 C 库函数time 将在 2038 年溢出,那到时候,它该何去何从
  • Mosh|初学者SQL教程第二弹
  • js原型和类---prototype,__proto__,new,class
  • 【嵌入式DIY实例-ESP8266篇】-LCD1602显示DS1631传感器数据
  • 前端八股文 vue2和vue3的区别
  • FlinkCDC-3.1.1 DataStream Source
  • 通过gateway 打印日志全局控制日志
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • C++类的相互关联
  • Flex布局到底解决了什么问题
  • js如何打印object对象
  • Material Design
  • Octave 入门
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • windows下如何用phpstorm同步测试服务器
  • zookeeper系列(七)实战分布式命名服务
  • 笨办法学C 练习34:动态数组
  • 普通函数和构造函数的区别
  • 深度学习中的信息论知识详解
  • 追踪解析 FutureTask 源码
  • #每日一题合集#牛客JZ23-JZ33
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (七)Knockout 创建自定义绑定
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)基于IDEA的JAVA基础1
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)创业的注意事项
  • (转)四层和七层负载均衡的区别
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .form文件_一篇文章学会文件上传
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET框架
  • .NET中的十进制浮点类型,徐汇区网站设计
  • 。Net下Windows服务程序开发疑惑
  • /boot 内存空间不够
  • @Autowired注解的实现原理
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ linux ] linux 命令英文全称及解释
  • [AIGC] MySQL存储引擎详解
  • [Android] Amazon 的 android 音视频开发文档
  • [Android] 修改设备访问权限