iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql中如何排查并发插入引起的死锁问题
  • 910
分享到

mysql中如何排查并发插入引起的死锁问题

2024-04-02 19:04:59 910人浏览 薄情痞子
摘要

小编给大家分享一下Mysql中如何排查并发插入引起的死锁问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!挂着VPN排查问题,不

小编给大家分享一下Mysql中如何排查并发插入引起的死问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

挂着VPN排查问题,不过当时并没有排查出原因

上班之后,发现是客户端的一个bug.本来应该发送一个请求,但是却发送了大量的请求,应用层面又没有做幂等设计,所以所有的请求都落到了数据库层面。
数据库是一个过程

环境
mysql 5.6.14
事务隔离级别 读提交

引起问题的逻辑大致如下:

CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;

Now suppose that three sessions perfORM the following operations in order:

Session 1:

START TRANSACTION;
INSERT INTO t1 VALUES(1);

Session 2:

START TRANSACTION;
INSERT INTO t1 VALUES(1);

Session 3:

START TRANSACTION;
INSERT INTO t1 VALUES(1);

Session 1:

ROLLBACK;

The first operation by session 1 acquires an exclusive lock for the row. The operations by sessions 2 and 3 both result in a duplicate-key error and they both request a shared lock for the row. When session 1 rolls back, it releases its exclusive lock on the row and the queued shared lock requests for sessions 2 and 3 are granted. At this point, sessions 2 and 3 deadlock: Neither can acquire an exclusive lock for the row because of the shared lock held by the other.

A similar situation occurs if the table already contains a row with key value 1 and three sessions perform the following operations in order:

Session 1:

START TRANSACTION;
DELETE FROM t1 WHERE i = 1;

Session 2:

START TRANSACTION;
INSERT INTO t1 VALUES(1);

Session 3:

START TRANSACTION;
INSERT INTO t1 VALUES(1);

Session 1:

COMMIT;

The first operation by session 1 acquires an exclusive lock for the row. The operations by sessions 2 and 3 both result in a duplicate-key error and they both request a shared lock for the row. When session 1 commits, it releases its exclusive lock on the row and the queued shared lock requests for sessions 2 and 3 are granted. At this point, sessions 2 and 3 deadlock: Neither can acquire an exclusive lock for the row because of the shared lock held by the other.


可以看到,Insert的时候,对记录上排它锁和插入意向锁.
并发的情况下,如果这个记录已经上了排它锁,则会尝试给这个记录上共享锁.
如果有三个以上的并发线程,
第一个线程上了排它锁,第二和第三个线程,看到该记录有排他锁,则尝试给这个记录上共享锁。
一旦第一个线程回滚,则第二,第三线程拥有共享锁的同时,都在申请排它锁.这时候就出现了死锁.

需要注意的是,假如第一个线程提交了,则第二个,第三个线程会报重复主键的错误,但是这时候,第二个,第三个线程,还是拥有这个记录的共享锁.第二,第三线程必须回滚.否则他们拥有的共享锁不释放.

回到最开始的问题.
三个线程同时insert award_free_firecracker_watch_common表,一个线程成功获取排它锁,其他两个线程上共享锁.
等获取排他锁的线程提交,两个上共享锁的线程,最后一步 update award_free_firecracker_watch_common表,则产生了死锁。
他们都是在获取了共享锁的同时,申请排它锁.

以上是“mysql中如何排查并发插入引起的死锁问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: mysql中如何排查并发插入引起的死锁问题

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql中如何排查并发插入引起的死锁问题
    小编给大家分享一下mysql中如何排查并发插入引起的死锁问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!挂着VPN排查问题,不...
    99+
    2024-04-02
  • Mysql并发插入死锁问题
    文章目录 一、问题二、复现表结构执行顺序死锁信息 三、死锁原因四、修改代码FA&QReference 一、问题 线上数据库版本,隔离级别:5.6.36-log,REPEA...
    99+
    2023-10-10
    mysql 数据库 sql 死锁
  • 如何解决HashMap并发时会引起死循环的问题
    这篇文章给大家分享的是有关如何解决HashMap并发时会引起死循环的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。今天研读Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时,其中有...
    99+
    2023-06-15
  • Java 内存模型与死锁:深入理解并发编程中的死锁问题
    Java 内存模型(JMM)是一套规范,它定义了 Java 程序中变量是如何在多个线程之间共享的。JMM 规定了线程如何从主内存中读取和写入变量,以及如何将变量的值存储到主内存中。 死锁是并发编程中常见的一种问题,它发生在两个或多个线程...
    99+
    2024-02-04
    Java 内存模型 死锁 并发编程 同步 等待 通知 中断
  • 如何深入解析mssql在高频高并发访问时键查找死锁问题
    如何深入解析mssql在高频高并发访问时键查找死锁问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。死锁对于DBA或是数据库开发人员而言并不陌...
    99+
    2024-04-02
  • C#开发中如何处理并发编程和死锁问题
    C#开发中如何处理并发编程和死锁问题,需要具体代码示例摘要:并发编程是现代软件开发中的重要主题,但也带来了一些挑战,例如线程安全、竞态条件和死锁等问题。本文将重点讨论在C#开发中处理并发编程和死锁问题的一些方法,并给出具体的代码示例。引言:...
    99+
    2023-10-22
    并发编程 (Concurrency Programming) 死锁问题 (Deadlock problem) 处理方法
  • 关于HashMap 并发时会引起死循环的问题解析
    今天研读Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时,其中有一个原因是:线程不安全的HashMap, HashMap在并发执行put操作时会引起死循...
    99+
    2024-04-02
  • C++ 函数如何解决并发编程中的死锁问题?
    在 c++++ 中,使用互斥量函数可以解决多线程并发编程中的死锁问题。具体步骤如下:创建一个互斥量;当线程需要访问共享变量时,获得互斥量;修改共享变量;释放互斥量。这样可以确保任何时刻只...
    99+
    2024-04-26
    并发编程 死锁 c++
  • ios开发try-catch引起的野指针问题排查
    目录1、野指针问题2、崩溃栈3、场景复现代码4、问题分析5、上报可能引起野指针崩溃栈1、野指针问题 【EXC_BAD_ACCESS (SIGSEGV) / KERN_INVALID_...
    99+
    2024-04-02
  • log4j2的高并发死锁问题配置如何优化
    这篇文章给大家分享的是有关log4j2的高并发死锁问题配置如何优化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。log4j2高并发死锁问题配置优化Maven中pom.xml引用<log4j2.version...
    99+
    2023-06-22
  • Oracle中如何监控并解决死锁问题
    在Oracle中,可以通过以下几种方式来监控和解决死锁问题: 使用Oracle Enterprise Manager(OEM)或S...
    99+
    2024-04-19
    Oracle
  • 如何在并发编程中避免死锁和饥饿问题?
    在并发编程中,死锁和饥饿问题是非常常见的。死锁指的是两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行的情况。饥饿问题则是指某个线程由于优先级低或资源不足而无法获得所需资源,一直处于等待状态。 为了避免死锁和饥饿问题,我们可以采...
    99+
    2023-07-23
    bash leetcode 并发
  • Golang的高并发场景中如何处理死锁和饥饿问题?
    死锁与饥饿在 go 并发编程中的成因和解决方法:死锁:由递归锁引起,避免方法是采用死锁避免算法。饥饿:由优先级反转引起,解决方法是使用优先级继承机制,让低优先级线程暂时获取高优先级线程的...
    99+
    2024-05-10
    死锁 饥饿 golang
  • 如何在 C++ 中处理并发编程中的死锁和饥饿问题?
    死锁:有序化资源和死锁检测;饥饿:优先级调度和公平锁。通过这些策略,可以在 c++++ 中解决死锁和饥饿问题,确保可靠性和效率。 如何在 C++ 中解决并发编程中的死锁和饥饿问题 并发...
    99+
    2024-05-08
    并发编程 死锁 饥饿 c++
  • C++并发编程:如何识别和解决死锁问题?
    在 c++++ 并发编程中,死锁问题发生在一或多个线程无限期等待其他线程释放资源时,导致程序挂起。我们可以使用 std::lock_guard 和 std::unique_lock 实现...
    99+
    2024-05-04
    c++ 死锁问题
  • mysql并发写入问题如何解决
    在MySQL中,可以通过以下几种方法来解决并发写入问题:1. 事务隔离级别:使用适当的事务隔离级别,如读已提交(Read Commi...
    99+
    2023-10-11
    mysql
  • 在python中如何解决死锁的问题
    这篇文章将为大家详细讲解有关在python中如何解决死锁的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.添加超时时间:fromthreading import Thread,&...
    99+
    2023-06-14
  • 如何解决Go语言中的死锁问题?
    如何解决Go语言中的死锁问题?Go语言具有并发编程的特性,可以通过使用goroutine和channel来实现并发操作。然而,在并发编程中,死锁是一个常见的问题。当goroutine之间相互依赖于彼此的资源,并且在访问这些资源时产生了循环依...
    99+
    2023-10-22
    解决方案 Go语言 死锁
  • 如何解决MySQL批量插入和唯一索引问题
    这篇文章主要介绍了如何解决MySQL批量插入和唯一索引问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL批量插入问题在开发项目时,...
    99+
    2024-04-02
  • C#开发中如何处理程序崩溃和死锁问题
    C#开发中如何处理程序崩溃和死锁问题,需要具体代码示例在C#开发过程中,程序崩溃和死锁问题是常见的挑战。处理这些问题是保证程序运行稳定和高效的关键,因此,本文将介绍如何处理程序崩溃和死锁问题,并提供一些具体的代码示例。程序崩溃问题处理程序崩...
    99+
    2023-10-22
    异常处理 崩溃恢复 死锁解决
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作