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

 更新时间:2024年09月09日 11:31:48   作者:coding喵  
死锁是数据库并发控制中的一种现象,它涉及多个事务在执行过程中相互等待对方占有的资源,导致无法继续执行,本文就来介绍一下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记录锁,出现死锁

避免死锁

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

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

相关文章

  • MySQL如何删除表中的数据

    MySQL如何删除表中的数据

    这篇文章主要介绍了MySQL如何删除表中的数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • MySQL容灾备份的实现方案

    MySQL容灾备份的实现方案

    进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下
    2025-08-08
  • mySQL 8.0.33安装指南(推荐)

    mySQL 8.0.33安装指南(推荐)

    本文提供MySQL8.0.33的详细安装步骤,从解压安装包到设置系统服务、配置远程访问及安全设置等,包括创建和配置MySQL用户,设置环境变量,初始化数据库等关键操作,同时强调安全性的重要性,如设置强密码、限制远程访问权限,并建议在重要操作前进行数据库备份
    2024-10-10
  • MySQL使用MRG_MyISAM(MERGE)实现分表后查询的示例

    MySQL使用MRG_MyISAM(MERGE)实现分表后查询的示例

    这篇文章主要介绍了MySQL使用MRG_MyISAM(MERGE)实现分表后查询的示例,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-12-12
  • 解决phpstudy无法启动MySQL服务的三种方法小结

    解决phpstudy无法启动MySQL服务的三种方法小结

    本文主要介绍了光速解决phpstudy无法启动MySQL服务的三种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • 简单了解 MySQL 中相关的锁

    简单了解 MySQL 中相关的锁

    这篇文章主要介绍了简单了解 MySQL 中相关的锁,重点介绍InnoDB中的锁相关知识,包括锁的概念及分类解析,对MySQL锁相关感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • 详解windows下mysql的主从同步

    详解windows下mysql的主从同步

    本文主要对windows下的mysql主从同步进行详细介绍。具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • mysql慢查询使用详解

    mysql慢查询使用详解

    慢查询是我们在mysql中经常需要使用到的一个很方便的功能,慢查询对于跟踪有问题的查询很有用,可以分析出当前程序里那些Sql语句比较耗费资源。
    2014-12-12
  • MyBatis拦截器实现分页功能的实现方法

    MyBatis拦截器实现分页功能的实现方法

    这篇文章主要介绍了MyBatis拦截器实现分页功能的实现方法的相关资料,希望通过本文大家能够实现这样的方法,需要的朋友可以参考下
    2017-10-10
  • MySQL实战文章(非常全的基础入门类教程)

    MySQL实战文章(非常全的基础入门类教程)

    半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字超硬核文章,想学习mysql的朋友可以看看
    2023-05-05

最新评论