返回顶部
首页 > 资讯 > 数据库 >MySQL:Innodb 一个死锁案例
  • 574
分享到

MySQL:Innodb 一个死锁案例

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

一、准备数据和问题 RR隔离级别 CREATE TABLE `ty` (   `id` int(11) NOT NU

一、准备数据和问题

RR隔离级别


CREATE TABLE `ty` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idxa` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4
insert into ty(a,b) values(2,3),(5,4),(6,7);

问:


MySQL:Innodb 一个死锁案例

image.png

这种情况会产生死,如果将
insert into ty(a,b) values(2,10);
改为:
insert into ty(a,b) values(5,10);

则不会产生死锁为什么?

二、初始化数据画图

本死锁的堵塞主要集中在二级索引中,我们将二级索KEY  idxa  ( a )和主键的数据按照Innodb引擎存储的方式大概排列一下则如图:

MySQL:Innodb 一个死锁案例

image.png


三、T2 步骤1

T2 步骤1:delete from ty where a=5;


-----TRX NO:334719 LOCK STRUCT(1)(Add by gaopeng)
RECORD LOCKS space id 653 page no 4 n bits 72 index idxa of table `test`.`ty` trx id 334719 lock_mode X(LOCK_X) locks gap and rec(LOCK_ORDINARY[next_key_lock])
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact fORMat; info bits 32
 0: len 4; hex 80000005; asc     ;; 1: len 4; hex 80000009; asc     ;;
-----TRX NO:334719 LOCK STRUCT(1)(Add by gaopeng)
RECORD LOCKS space id 653 page no 3 n bits 72 index PRIMARY of table `test`.`ty` trx id 334719 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)
Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 4; hex 80000009; asc     ;; 1: len 6; hex 000000051b7f; asc       ;; 2: len 7; hex 760000082b13fd; asc v   +  ;; 3: len 4; hex 80000005; asc     ;; 4: len 4; hex 80000004; asc     ;;
-----TRX NO:334719 LOCK STRUCT(1)(Add by gaopeng)
RECORD LOCKS space id 653 page no 4 n bits 72 index idxa of table `test`.`ty` trx id 334719 lock_mode X(LOCK_X) locks gap before rec(LOCK_GAP)
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80000006; asc     ;; 1: len 4; hex 8000000a; asc     ;;

根据这个记录我们可以画图如下,红色部分为锁定的部分箭头为gap lock:

MySQL:Innodb 一个死锁案例

image.png

四、T1 步骤2

T2 步骤1:delete from ty where a=5; 堵塞


-----TRX NO:334724 LOCK STRUCT(1)(Add by gaopeng)
RECORD LOCKS space id 653 page no 4 n bits 72 index idxa of table `test`.`ty` trx id 334724 lock_mode X(LOCK_X) locks gap and rec(LOCK_ORDINARY[next_key_lock]) waiting(LOCK_WAIT)
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000005; asc     ;; 1: len 4; hex 80000009; asc     ;;

根据这个记录我们可以画图如下,黄色部分为事务T1准备上锁但是被堵塞的部分,包含黄色部分和红色部分的记录说明它既被T2锁定了并且T1拿不到这条记录的锁,它实际上就是一个next key lock的堵塞:

MySQL:Innodb 一个死锁案例

image.png

五、T2步骤3

这一步如果是:

insert into ty(a,b) values(2,10);
则发生死锁,实际上这一条记录记录在二级索引的值为(2,11),11是主键的值,则画图如下:


MySQL:Innodb 一个死锁案例

image.png

这种情况下则T2也被堵塞,因为这个区域T1也处于堵塞下,则发生死锁。死锁记录如下:


*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 653 page no 4 n bits 72 index idxa of table `test`.`ty` trx id 334712 lock_mode X(LOCK_X) locks gap before rec(LOCK_GAP) insert intention(LOCK_INSERT_INTENTION) waiting(LOCK_WAIT)
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000005; asc     ;; 1: len 4; hex 80000009; asc     ;;

及插入印象锁堵塞

这一步如果是:

insert into ty(a,b) values(5,10);
不会发生死锁,,实际上这一条记录记录在二级索引的值为(5,11),11是主键的值,则画图如下:

MySQL:Innodb 一个死锁案例

image.png

如果是这种情况,不会发生死锁,我们可以看到对于二级索引而言这个区域没有其他事物堵塞,只是T2最开始获取过,本事务再次获取不会有问题。

六、总结

本案例实际上就是看最后触发死锁的插入操作插入的记录到底落在二级索引的哪个区域。

作者微信MySQL:Innodb 一个死锁案例


您可能感兴趣的文档:

--结束END--

本文标题: MySQL:Innodb 一个死锁案例

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

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

猜你喜欢
  • MySQL:Innodb 一个死锁案例
    一、准备数据和问题 RR隔离级别 CREATE TABLE `ty` (   `id` int(11) NOT NU...
    99+
    2024-04-02
  • MySQL死锁案例分析
    最近项目中某个模块稳定复现MySQL死锁问题,本文记录死锁的发生原因以及解决办法。 1. 预备知识 1.1 表锁和行锁 表锁 表锁是MySQL中最基本的锁策略,并且是开销最小的策略。表锁会锁定整张数据表,用户的写操作(插入/删除/更新...
    99+
    2015-02-06
    MySQL死锁案例分析
  • 【MySQL】死锁案例之八
    一 前言 死锁其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友...
    99+
    2024-04-02
  • 【MySQL】死锁案例之六
    一 前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。 二 案...
    99+
    2024-04-02
  • 【MySQL】死锁案例之三
    一 前言       死锁,其实是一个很有意思,也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见过。关于死锁我会持续写一个系列的案例分析,希望能...
    99+
    2024-04-02
  • Java检测死锁案例
    导致死锁的程序 package com.study.train; import java.io.IOException; import java.lang.management...
    99+
    2024-04-02
  • 一个mysql死锁场景实例分析
    前言 最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录。 涉及知识点:共享锁、排他锁、意向锁、间隙锁、插入意向锁、锁等待队列 场景 隔离级别:Repeatable-Rea...
    99+
    2024-04-02
  • 剖析6个MySQL死锁案例的原因以及死锁预防策略
    ...
    99+
    2015-02-16
    剖析6个MySQL死锁案例的原因以及死锁预防策略
  • MySQL死锁的案例分享
    本篇内容介绍了“MySQL死锁的案例分享”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两个死锁的小例子: ...
    99+
    2024-04-02
  • MySQL死锁的案例详解
    本篇内容介绍了“MySQL死锁的案例详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 实现锁定一个redis的案例
    这篇文章将为大家详细讲解有关实现锁定一个redis的案例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。redis加锁分类redis能用的的加锁命令分别是INCR、SETN...
    99+
    2024-04-02
  • java并发编程死锁定义及避免死锁案例分析
    这篇文章主要介绍“java并发编程死锁定义及避免死锁案例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java并发编程死锁定义及避免死锁案例分析”文章能帮助大家解决问题。场景模拟分析场景一:狭路...
    99+
    2023-06-29
  • Go select 死锁的一个细节
    目录下面对是一个 select 死锁的问题 package main import "sync" func main() { var wg sync.WaitGr...
    99+
    2024-04-02
  • mysql insert导致死锁的案例介绍
    本篇内容介绍了“mysql insert导致死锁的案例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两...
    99+
    2024-04-02
  • MYSQL中一个特殊的MDL LOCK死锁的示例分析
    本篇文章为大家展示了MYSQL中一个特殊的MDL LOCK死锁的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、问题由来前段开发反馈时间线上数据库老是出现...
    99+
    2024-04-02
  • Go并发编程之死锁与活锁的案例分析
    目录什么是死锁、活锁发生死锁的案例分析发生活锁的案例分析什么是死锁、活锁 什么是死锁:就是在并发程序中,两个或多个线程彼此等待对方完成操作,从而导致它们都被阻塞,并无限期地等待对方完...
    99+
    2023-05-18
    Go死锁 活锁分析 Go 死锁 活锁 Go死锁 Go活锁
  • C#多线程死锁介绍与案例代码
    一、死锁简介 在多道程序设计环境下,多个进程可能竞争一定数量的资源,。一个进程申请资源,如果资源不可用,那么进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待的进程有可...
    99+
    2024-04-02
  • 谈谈MySQL死锁 一
    数据越来越和我们的生活离不开,数据在生命周期的各个阶段有着不同的痛点和需求以及特殊场景。 CURD是数据的四大基本需求:写入,更新,读取,删除. 今天,来谈一谈死锁问题 死锁...
    99+
    2024-04-02
  • 面试官:请用SQL模拟一个死锁
    文章首发于公众号:BiggerBoy 有读者说面试被问到怎么用SQL模拟数据库死锁? 这位读者表示对Java中的死锁还是略知一二的,但是突然用SQL写死锁的案例之前还真没遇到过,这个问题没答上来。所以今天就带大家一起来看下怎么用SQL...
    99+
    2017-02-06
    面试官:请用SQL模拟一个死锁
  • Java 死锁解决方案顺序锁和轮询锁
    目录死锁解决方案分析解决方案1:顺序锁解决方案2:轮询锁总结前言: 死锁(Dead Lock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方停止执行,以取得系统资源...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作