返回顶部
首页 > 资讯 > 数据库 >innodb next-key lock引发的死锁现象分析
  • 907
分享到

innodb next-key lock引发的死锁现象分析

2024-04-02 19:04:59 907人浏览 泡泡鱼
摘要

这个例子是我在网上看到的,我分析了很久才弄明白锁产生的具体过程。 数据库的事务隔离级别是RR。 建测试表: CREATE TABLE `LockTest` (  

这个例子是我在网上看到的,我分析了很久才弄明白产生的具体过程。

数据库事务隔离级别是RR。

测试表:
CREATE TABLE `LockTest` (
   `order_id` varchar(20) NOT NULL,
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (`id`),
   KEY `idx_order_id` (`order_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

测试步骤:
事务1 事务2

begin

delete from LockTest where order_id =  'D20'

 
 

 

begin

delete from LockTest where order_id =  'D19'

insert into LockTest (order_id) values ('D20')

 
 

insert into LockTest (order_id) values ('D19')

commit

commit


测试结果:
事务1 执行到insert语句会block住,事务2执行insert语句会提示死锁错误。

原因分析:
1、首先看测试表的建表语句,id是主键索引,同时该主键是自增主键。order_id是普通索引。
2、事务1执行delete from LockTest where order_id =  'D20';语句时,由于数据库的隔离级别是RR,因此此时事务1在主键id上获得了一个next-key lock,这个锁的范围是[16, +∞)。
   这个16就来自于AUTO_INCREMENT=16,因为LockTest目前是张空表。
3、同理,事务2执行delete from LockTest where order_id =  'D19';语句时,由于数据库的隔离级别是RR,事务2在主键id上也获得了一个next-key lock,这个锁的范围是[16, +∞)。
   也就是说此时,事务1和事务2获得的锁是一样的。
4、事务1继续执行insert into LockTest (order_id) values ('D20');语句,这个时候由于该语句企图往LockTest表insert一行id=16,order_id=D20的数据,
   但是由于在事务2的delete语句中,主键id上已经有了一个范围为[16, +∞)的锁,导致事务1此时想插入数据插不进去,被阻塞了。
5、继续事务2的插入语句insert into LockTest (order_id) values ('D19'); 该插入语句同样也想往LockTest表insert一行id=16,order_id=D19的数据,
   但是由于由于在事务1的delete语句中,主键id上已经有了一个范围为[16, +∞)的锁,导致事务2此时想插入数据插不进去,被阻塞了。
   此时,可以发现,事务1和事务2的锁是互相持有,互相等待的。所以innodb判断该事务遇到了死锁,直接将事务2进行了回滚。然后回头去看事务1,insert into LockTest (order_id) values ('D20');被成功执行。

如果你将数据库的事务隔离级别修改为RC,上述事务会各自成功运行,不会互相影响。





您可能感兴趣的文档:

--结束END--

本文标题: innodb next-key lock引发的死锁现象分析

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

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

猜你喜欢
  • innodb next-key lock引发的死锁现象分析
    这个例子是我在网上看到的,我分析了很久才弄明白锁产生的具体过程。 数据库的事务隔离级别是RR。 建测试表: CREATE TABLE `LockTest` (  ...
    99+
    2024-04-02
  • MYSQL INNODB replace into 死锁 及 next key lock 浅析
    原创:全文带入了大量自我认知和理解,可能错误,因为水平有限,但是代表我努力分析过。 一、问题提出 问题是由姜大师提出的、问题如下: 表: mysql> show create table c \...
    99+
    2024-04-02
  • MySQL中next-key lock加锁范围的示例分析
    这篇文章主要介绍MySQL中next-key lock加锁范围的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言某天,突然被问到 MySQL 的 next-key lock,我瞬间的反应就是:这都是啥啥啥?...
    99+
    2023-06-15
  • INSERT语句引发的死锁实例分析
    这篇文章主要介绍“INSERT语句引发的死锁实例分析”,在日常操作中,相信很多人在INSERT语句引发的死锁实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”INSERT...
    99+
    2024-04-02
  • Spring之ShutDown Hook死锁现象源码分析
    本篇内容主要讲解“Spring之ShutDown Hook死锁现象源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring之ShutDown Hook死锁现象源码分...
    99+
    2023-07-05
  • MYSQL中一个特殊的MDL LOCK死锁的示例分析
    本篇文章为大家展示了MYSQL中一个特殊的MDL LOCK死锁的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、问题由来前段开发反馈时间线上数据库老是出现...
    99+
    2024-04-02
  • MySQL 优化 index merge引起的死锁分析
    目录背景死锁日志表结构执行计划为什么会用 index_merge(索引合并)解决方案一、从代码层面二、从MySQL层面背景 生产环境出现死锁流水,通过查看死锁日志,看到造成死锁的是两...
    99+
    2024-04-02
  • MyIsam与InnoDB引擎的锁实现以及避免死锁产生的方法
    这篇文章主要讲解了“MyIsam与InnoDB引擎的锁实现以及避免死锁产生的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MyIsam与InnoDB引擎...
    99+
    2024-04-02
  • Go并发编程之死锁与活锁的案例分析
    目录什么是死锁、活锁发生死锁的案例分析发生活锁的案例分析什么是死锁、活锁 什么是死锁:就是在并发程序中,两个或多个线程彼此等待对方完成操作,从而导致它们都被阻塞,并无限期地等待对方完...
    99+
    2023-05-18
    Go死锁 活锁分析 Go 死锁 活锁 Go死锁 Go活锁
  • java引发死锁的四种情况分别是什么
    这篇文章主要介绍java引发死锁的四种情况分别是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、四种情况(1)交叉锁导致程序死锁:比如线程A持有R1的锁等待R2的锁,线程B持有R2的锁等待R1的锁(2)内存不足...
    99+
    2023-06-15
  • MyISAM与InnoDB索引实现的对比分析
    小编给大家分享一下MyISAM与InnoDB索引实现的对比分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MyISAM索引实现...
    99+
    2024-04-02
  • 多核编程中的锁竞争现象分析
    这篇文章主要介绍“多核编程中的锁竞争现象分析”,在日常操作中,相信很多人在多核编程中的锁竞争现象分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”多核编程中的锁竞争现象分析”...
    99+
    2024-04-02
  • Linux文件执行中的锁定怪现象分析
    这篇文章将为大家详细讲解有关Linux文件执行中的锁定怪现象分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。linux下,一个可执行文件exe1正在执行中,rm –f可以将其删除,m...
    99+
    2023-06-13
  • Java 并发包中的读写锁及其实现分析
    这期内容当中小编将会给大家带来有关Java 并发包中的读写锁及其实现分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 前言在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他...
    99+
    2023-06-17
  • SQLServer 错误 7903 表错误:在对象 ID O_ID,索引 ID I_ID,分区 ID PN_ID,列 ID C_ID 的 FileStream 目录中发现孤立文件“FILE”。 故障
    详细信息 Attribute 值 产品名称 SQL Server 事件 ID 7903 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 DBCC2_FS_ORPHANED_FILE 消息...
    99+
    2023-11-05
    错误 孤立 分区
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作