返回顶部
首页 > 资讯 > 数据库 >MySQL insert死锁问题解决详细记录
  • 330
分享到

MySQL insert死锁问题解决详细记录

2024-04-02 19:04:59 330人浏览 独家记忆
摘要

目录Insert死锁问题剖析前置知识构造死锁原因故死锁产生的原因Mysql 5.7 的死锁前提示例原因解决方案总结Insert死锁问题剖析 线上有个批量的insert … on duplicate key

Insert死锁问题剖析

线上有个批量的insert … on duplicate key update语句引发的死锁问题,查过很多资料并且亲自尝试过后,发现好多博客说的都是错的,其实本身只跟insert的顺序有关,在此记录一下备忘。

前置知识

X型锁:排他锁

S型锁:共享锁

行锁:锁住一行记录

Next-Key锁:左开右闭区间

Gap锁:左右开区间

构造死锁

建表:

CREATE TABLE hero (
    number INT AUTO_INCREMENT,
    name VARCHAR(100),
    country varchar(100),
    PRIMARY KEY (number),
    UNIQUE KEY uk_name (name)
) Engine=InnoDB CHARSET=utf8;

构造初始数据:

INSERT INTO hero VALUES
    (1, 'l刘备', '蜀'),
    (3, 'z诸葛亮', '蜀'),
    (8, 'c曹操', '魏'),
    (15, 'x荀彧', '魏'),
    (20, 's孙权', '吴');

好了,开始了,下面开始两个事务,按顺序执行:

事务1

begin:
INSERT INTO hero(name, country) VALUES('g关羽', '蜀');

事务2

begin:
INSERT INTO hero(name, country) VALUES('g关羽', '蜀');

事务1

INSERT INTO hero(name, country) VALUES('d邓艾', '魏');

来了,它来了,这个时候我们就可以注意到事务2的死锁报错了:

# 事务T2
mysql> INSERT INTO hero(name, country) VALUES('g关羽', '蜀');
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

原因

请添加图片描述

  • T1先插入name值为g关羽的记录,可以插入成功,此时对应的唯一索引记录被隐式锁保护
  • T2随后插入name值为g关羽的记录(必须为同一条记录),发生阻塞,并且T2会想要获取一把S型next-key锁(只有唯一索引才会发生)(左开右闭)。此时T1的隐式锁转化为显示锁(X型行锁)
  • T1想要插入d邓艾的记录,由于T2的next-key锁(虽然没被T2持有,但锁已存在)而进入阻塞等待状态,进而发生死锁

MySQL insert死锁问题解决详细记录

故死锁产生的原因

  • T1在等待T2释放name值为’g关羽’的二级索引记录上的gap锁。
  • T2在等待T1释放name值为’g关羽’的二级索引记录上的X型行锁。

Mysql 5.7 的死锁

前提

在比较新的版本中都可以遇见的,只要是insert … on duplicate key update 触发了后面的update操作,那么此时其他的insert语句都会被阻塞,这主要是为了解决RR下的一些幻读问题。

示例

在5.7版本中又有一些特殊情况。还是举例

假如有如下表和数据

demo表

idnamevalue
11112
12222
13332

此时,如果事务1执行了:

insert into demo (name, value) VALUES ("333", 1) ON duplicate KEY UPDATE value = value + 1;

事务2执行了:

insert into demo (name, value) VALUES ("223", 1) ON duplicate KEY UPDATE value = value + 1;

事务3执行了:

insert into demo (name, value) VALUES ("224", 1) ON duplicate KEY UPDATE value = value + 1;

那么首先事务2和事务3会被阻塞,然后事务1提交了,事务2和事务3就会发生死锁,其中一个爆出死锁的错误然后失败,另一个则成功执行。

原因

当insert … on duplicate key 执行成功之时,会在当前唯一键和之前唯一键之间加一个隐式GAP锁,如上会在222和333之间加上GAP锁,此时,事务2和事务3想插入新数据都会被GAP锁阻塞,此时GAP锁转为显式,事务2和事务3同时也分别想要获取X型的插入意向锁。

然后事务1提交,此时GAP锁并不会被释放,由于5.7的bug,事务2和事务3都会拿到GAP锁,此时他们去获取插入意向锁的时候由于GAP锁被对方拿到而矛盾,进而死锁。

解决方案

网上有很多方法,这里我提出一个另类的想法。

我们可以先用非事务的insert ignore去初始化数据,后面在用事务的update操作去更新。

参考:https://zhuanlan.zhihu.com/p/457191971

总结

到此这篇关于MySQL insert死锁问题的文章就介绍到这了,更多相关MySQL insert死锁问题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL insert死锁问题解决详细记录

本文链接: https://lsjlt.com/news/117036.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL insert死锁问题解决详细记录
    目录Insert死锁问题剖析前置知识构造死锁原因故死锁产生的原因MySQL 5.7 的死锁前提示例原因解决方案总结Insert死锁问题剖析 线上有个批量的insert … on duplicate key ...
    99+
    2024-04-02
  • MySQL insert死锁问题解决详细记录
    目录Insert死锁问题剖析前置知识构造死锁原因故死锁产生的原因MySQL 5.7 的死锁前提示例原因解决方案总结Insert死锁问题剖析 线上有个批量的insert &hellip...
    99+
    2022-11-13
    mysql insert死锁 mysql死锁排查及解决 MySQL死锁
  • Mysql超详细讲解死锁问题的理解
    目录1、什么是死锁?2、Mysql出现死锁的必要条件资源独占条件请求和保持条件不剥夺条件相互获取锁条件3、 Mysql经典死锁案例3.1 建表语句3.2 初始化相关数据3.3 正常转...
    99+
    2024-04-02
  • 死锁问题详解
    目录前言资源可抢占资源和不可抢占资源资源获取死锁资源死锁的条件死锁模型鸵鸟算法死锁检测和恢复从死锁中恢复通过抢占进行恢复通过回滚进行恢复杀死进程恢复死锁避免单个资源的银行家算法破坏死...
    99+
    2024-04-02
  • 【mysql】mysql死锁问题解决方案
    mysql死锁问题解决方案 查询出是被哪个进程给锁住了为什么会产生死锁日志内容:日志解析:找到问题: 解决方案 查询出是被哪个进程给锁住了 执行sql: select ...
    99+
    2023-09-23
    mysql adb 数据库
  • 怎样解决Mysql死锁问题
    怎样解决Mysql死锁问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 show engine in...
    99+
    2024-04-02
  • Mysql如何解决死锁问题
    这篇文章主要为大家展示了“Mysql如何解决死锁问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Mysql如何解决死锁问题”这篇文章吧。 ...
    99+
    2024-04-02
  • 如何解决MySQL死锁问题
    这篇文章主要介绍“如何解决MySQL死锁问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何解决MySQL死锁问题”文章能帮助大家解决问题。1、什么是死锁死锁是并...
    99+
    2024-04-02
  • mysql insert into ... select的死锁问题是什么
    小编给大家分享一下mysql insert into ... select的死锁问题是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!问题产生:系统中mysql里面有几个event...
    99+
    2024-04-02
  • mysqlkillprocess解决死锁问题
    目录mysql kill process解决死锁mysql死锁异常分析及解决问题产生原因分析解决方案mysql kill process解决死锁 1、查看进程列表, 找到ID sho...
    99+
    2024-04-02
  • mysql死锁和分库分表问题详解
    记录生产mysql的问题点。 业务场景与问题描述 请求一个外部接口时,每天的请求量在900万左右。 分为请求项目和回执这两个项目。请求是用来调用外部接口,回执是接收发送的接口。 在发送请求前会先插入数据库。 在请求...
    99+
    2022-06-01
    mysql死锁的例子 mysql死锁的原因和处理方法 mysql
  • Oracle锁表解决方法的详细记录
    目录前言解决方法如下:总结前言 锁表或锁超时相信大家都不陌生,经常发生在DML语句中,产生的原因就是数据库的独占式封锁机制,当执行DML语句时对表或行数据进行锁住,直到事务提交或回滚...
    99+
    2024-04-02
  • RC级别下MySQL死锁问题的解决
    目录背景死锁分析死锁解决背景 在工作中碰到一次死锁问题,业务背景是在mq接收商品主数据时会更新商品其他数据,由于商品主数据和商品其他信息是一对多的关系,所以采用先删后增的方式,结果异...
    99+
    2024-04-02
  • sql死锁问题怎么解决
    本篇内容介绍了“sql死锁问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! --查询锁表信息,...
    99+
    2024-04-02
  • Java死锁问题怎么解决
    今天小编给大家分享一下Java死锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:死锁(Dead Lock)...
    99+
    2023-06-30
  • sqlserver死锁问题怎么解决
    在SQL Server中解决死锁问题通常需要以下步骤: 监控死锁:使用SQL Server Profiler或Extended ...
    99+
    2024-05-11
    sqlserver
  • MySQL死锁问题的分析及解决方法
    这篇文章主要讲解了“MySQL死锁问题的分析及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL死锁问题的分析及解决方法”吧!MySQL死锁问...
    99+
    2024-04-02
  • java多线程死锁问题的详细介绍
    本篇内容主要讲解“java多线程死锁问题的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java多线程死锁问题的详细介绍”吧!一、什么是死锁当两个或两个...
    99+
    2024-04-02
  • Java死锁问题详解及示例
    目录一、死锁简介二、Java死锁产生的条件可以归纳为以下四个:三、死锁产生的原因四、避免死锁的策略五、代码示例六、诊断死锁七、总结一、死锁简介 在Java程序中,死锁是指两个或多个线...
    99+
    2023-05-18
    Java 死锁 Java死锁示例
  • 怎么理解MySQL wwwhj8828coml8o88O49999死锁问题
    本篇内容介绍了“怎么理解MySQL wwwhj8828coml8o88O49999死锁问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作