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并发插入死锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • window下mysql 8.0.15 安装配置方法图文教程

    window下mysql 8.0.15 安装配置方法图文教程

    这篇文章主要为大家详细介绍了window下mysql 8.0.15 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • MySQL 8.0.18 稳定版发布! Hash Join如期而至

    MySQL 8.0.18 稳定版发布! Hash Join如期而至

    MySQL 8.0.18 稳定版发布! Hash Join 如期而至,这篇文章带大家快速浏览一下MySQL 8.0.18 稳定版的各个亮点,感兴趣的小伙伴们可以学习参考一下
    2019-10-10
  • MySQL limit性能分析与优化

    MySQL limit性能分析与优化

    今天小编就为大家分享一篇关于MySQL limit性能分析与优化,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • mysql root用户的密码修改和消除

    mysql root用户的密码修改和消除

    本文主要针对于Windows环境下root用户密码的修改以及密码的消除
    2009-06-06
  • 12个优化MySQL的技巧小整理

    12个优化MySQL的技巧小整理

    这篇文章主要介绍了12个优化MySQL的技巧小整理,包括表连接和WHERE语句等基本的优化点等内容,已经了解的也不妨加深一下印象,需要的朋友可以参考下
    2015-06-06
  • MySql中表的复合查询实现示例

    MySql中表的复合查询实现示例

    在MySQL中,复合查询是对多张表进行查询的操作,包括多表查询、自连接、子查询等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 详解MySQL中如何定位阻塞语句

    详解MySQL中如何定位阻塞语句

    MySQL 阻塞是指在并发访问 MySQL 数据库时,某个事务占用了资源并且长时间不释放,导致其他事务无法执行或执行缓慢的情况,那如何排查和定位阻塞语句呢,下面来分析下吧
    2023-07-07
  • MySQL btree索引与hash索引区别

    MySQL btree索引与hash索引区别

    这篇文章主要介绍了MySQL btree索引与hash索引区别,帮助大家更好的理解和学习MySQL索引的相关知识,感兴趣的朋友可以了解下
    2020-09-09
  • pycharm2017实现python3.6与mysql的连接

    pycharm2017实现python3.6与mysql的连接

    这篇文章主要为大家详细介绍了PyCharm连接MySQL数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • MySQL表的碎片整理和空间回收的方法

    MySQL表的碎片整理和空间回收的方法

    本文主要介绍了MySQL表的碎片整理和空间回收的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论