一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

一次开发中并发删除插入死锁分析记录 这两天在开发一个项目的时候有一个操作是多线程同步数据,每个线程同步一个类型的数据,同步流程是先删除此类型下所有数据,然后批量插入新数据。但是测试过程中会发现有死锁现象,虽然可以直接对删除插入代码使用同步代码块的方式快速解决问题,但是本着学习的心态还是研究了一番死锁产生的根因,记录如下。 表结构如下(脱敏简化,主键ID实际是UUID) CREATE TABLE `t2` ( `id` char(1) NOT NULL, `type` varchar(255) DEFAULT NULL, PRI 阅读详情

最近遇到一个由于唯一性索引,导致并发插入产生死锁的场景,在分析死锁产生的原因时,发现这一块还挺有意思的,涉及到MySql中不少的知识点,特此总结记录一下。

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

一、MySql常见的锁

谈到mysql的锁,可以说的就比较多了,比如行锁、表锁、页锁、元数据锁等,当然我们这里没打算把所有的都细列出来,我们这里主要针对行锁、gap锁进行拓展,以方便分析第二节中,为什么并发插入同样的数据会产生死锁的问题

0. 锁分类

我们最常说的锁,可以区分为共享锁(S)和排它锁(X),在mysql的innodb引擎中,为了解决幻读问题,引入了gap锁以及next key lock;除此之外,还有一种意向锁的,比如插入意向锁

本文将主要介绍的以下几种锁

  • 行锁(record lock): 请注意它是针对索引的锁(所以如果没有索引时,最终行锁就会导致整个表都会被锁住)
  • 共享锁(S Lock): 也叫读锁,共享锁之间不会相互阻塞(顾名思义)
  • 排它锁(X Lock): 也叫写锁,排它锁一次只能有一个session(或者说事务?)持有
  • 间隙锁(gap lock): 针对索引之间的间隙
  • Next-key锁(Next-key lock):可以简单理解为行锁 + 间隙锁

上面虽然介绍了几种锁的基本定义,但是什么时候是行锁,怎样获取共享锁,排它锁又是在哪些场景下会产生呢?gap lock/next key lock又是怎样解决幻读的呢?

下面所有的都是基于mysql5.7.22 innodb引擎,rr隔离级别进行说明

1.共享锁与排它锁

下表介绍我们的实际使用的sql中,是否会使用锁,以及会产生什么锁

共享锁与排他锁区分

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

2. 行锁、表锁、gap锁、next-key锁区分

这几个的区分,主要就是看我们最终锁住的效果,比如

  • 没有索引,加S/X锁最终都是锁整表 (为啥?因为锁是针对索引而言的)
  • 根据主键/唯一键锁定确定的记录:行锁
  • 普通索引或者范围查询:gap lock / next key lock

行锁和gap锁之间最大的区别是:

  • 行锁针对确定的记录
  • 间隙锁是两个确定记录之间的范围; next key lock则是除了间隙还包括确定的记录

3. 实例演示

看上面的两个说明,自然就想在实际的case中操刀分析一下,不同的sql会产生什么样的锁效果

  • 针对表中一条确定的记录加X锁,是只有行锁嘛?
  • 针对表中多条确定的记录加X锁,又会怎样?
  • 针对表中一条不存在的记录加X锁,会有锁产生吗?如果是gap锁,那区间怎么定?
  • 针对范围加X锁,产生的gap锁范围怎么确定呢?

在分析上面几种case之前,我们得先有一个概念,锁是针对索引而言的,这一点非常非常重要

其次不同的索引,我们需要分别进行测试(其实就是唯一索引与普通索引)

3.1 表准备

接下来针对上面的四种场景,设计我们的测试用例,首先我们准备三张表

  • 无索引表 TN
  • 唯一索引表 TU
  • 普通索引表 TI

对应的表结构和初始化数据如下

CREATE TABLE `tn` (
  `id` int(11) unsigned NOT NULL,
  `uid` int(11) unsigned NOT NULL
) ENGINE=InnoDB;

CREATE TABLE `tu` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u_uid` (`uid`)
) ENGINE=InnoDB;

CREATE TABLE `ti` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `u_uid` (`uid`)
) ENGINE=InnoDB;


INSERT INTO `tn` (`id`, `uid`) VALUES (1, 10), (5, 20), (10, 30);
INSERT INTO `tu` (`id`, `uid`) VALUES (1, 10), (5, 20), (10, 30);
INSERT INTO `ti` (`id`, `uid`) VALUES (1, 10), (5, 20), (10, 30);

3.2 精确匹配

即我们的sql可以精确命中某条记录时,锁的情况如下:

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

请注意上面的结论,无索引时锁全表好理解,但是普通索引的TI表,居然还有一个[10, 30)的gap锁就有点超乎我们的想象了;

接下来我们验证一下

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

上图基本流程如下:

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

从上面的实测也可以看出,普通索引下添加x锁,居然会加一个gap锁,而且这个gap区间是前一个记录(并包含它),到下一个记录

如 uid = 20, 前后两个记录为(1, 10), (10, 30)

  • gap lock: 范围为 [10, 30)
  • 因此无法插入uid=[10,30)
  • 注意,uid=10上有gap锁只是不能插入记录,但是加X锁是没有问题的(有兴趣的可以测试一下)

3.3 精确查询未匹配

当我们锁的记录不存在时,锁情况如下:

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

实测case如下(TN省略,锁全表的没啥测试必要性)

基本流程就不画图了,上面图中已经有文字描述了

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

从上面的测试也可以看出,uid=30没有被锁住,这里只在uid=(20, 30)这一区间添加了gap锁

唯一索引与普通索引表现一致,会阻塞insert的插入意向锁(后面说这个东西)

3.4 范围查询

当我们锁一段区间时,锁的情况如下:

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

简单来说,范围查询时,添加next key lock,根据我们的查询条件,找到最左边和最右边的记录区间

如 uid > 15 and uid < 25,找到的记录是(1, 10), (10, 30)

  • gap锁为(10, 30)
  • next key lock会为右边添加行锁,即uid=30加X锁
  • 因此针对uid=30记录加锁会被阻塞(但是针对uid=28,29加x锁则不会被阻塞,插入会,有兴趣的小伙伴可以实测一下)

说明:范围加x锁时,可能锁住不在这个区间的记录,一不小心可能导致死锁哦

3.5 小结

在RR隔离级别中,我们一般认为可以产生锁的语句为:

  • SELECT ... FOR UPDATE: X锁
  • SELECT ... LOCK IN SHARE MODE: S锁
  • update/delete: X锁

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

| 普通索引 | 精确匹配,且命中 | 行锁 + gap lock (上一个记录和下个记录区间,左闭右开,左边记录非行锁) | 普通索引 | 精确匹配,未命中 | gap lock | | 普通索引 | 范围查询 | next key lock |

4. 锁冲突

上面介绍了不同场景下会产生什么样的锁,但是看完之后会有一个疑问,针对行锁其他会话竞争的时候,可以按照X/S锁的规则来,但是这个GAP LOCK貌似只针对insert有效,insert除了加X锁之外是不是还有其他的特殊逻辑?

4.1 插入意向锁

插入意向锁其实是一种特殊的 gap lock,但是它不会阻塞其他锁。假设存在值为 4 和 7 的索引记录,尝试插入值 5 和 6 的两个事务在获取插入行上的排它锁之前使用插入意向锁锁定间隙,即在(4,7)上加 gap lock,但是这两个事务不会互相冲突等待;但是如果这个区间存在gap lock,则会被阻塞;如果多个事务插入相同数据导致唯一冲突,则在重复的索引记录上加读锁

简单来说,它的属性为:

  • 它不会阻塞其他任何锁;
  • 它本身仅会被 gap lock 阻塞

其次一个重要知识点:

  • 通常insert语句,加的是行锁,排它锁
  • 在insert之前,先通过插入意向锁,判断是否可以插入(仅会被gap lock阻塞)
  • 当插入唯一冲突时,在重复索引上添加读锁
    • 原因如下:
    • 事务1 插入成功未提交,获取了排它锁,但是事务1最终可能会回滚,所以其他重复插入事务不应该直接失败,这个时候他们改为申请读锁(疑问点:为什么要改成读锁呢?)

4.2 锁冲突矩阵

简单版矩阵

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

当我们将gap lock(间隙锁), next key lock(next-key锁), Insert Intention lock(插入意向锁)也加入矩阵时,就会复杂很多了

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

说明:

  • not gap: 行锁
  • gap: gap lock
  • next-key: gap + 行锁

小结:

针对上面的矩阵,理解下面几个原则即可推导上面矩阵

  • gap lock只会与插入意向锁冲突
  • X行锁会与行锁冲突
  • next key lock: 行锁 + gap锁 锁区间内,插入冲突; 行锁的X锁冲突

二、并发插入死锁分析

上面属于基本知识点,接下来我们看一个实际导致死锁的case

  • 并发插入相同记录导致死锁

0. 表准备

创建一个最简单最基础的表,用于演示

CREATE TABLE `t` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

INSERT INTO `t` (`id`) VALUES (1);

1. 事务回滚的死锁问题

场景复现:

step1:

-- session1: 
begin; insert into t values (2);

-- session2:
begin; insert into t values (2);
-- 阻塞

-- session3:
begin; insert into t values (2);
-- 阻塞

step2:

-- session1:
rollback;

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

原因分析:

死锁日志查看

SHOW ENGINE INNODB STATUS;

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

step1:

  • session1: 插入(id=2),会添加一个X + Next Lock锁
  • session2/3: 插入(id=2),插入意向锁被阻塞,改为持有S + Next Lock锁

step2:

  • session1: 回滚,释放X锁
  • session2/3: 竞争X锁,只有对方释放S锁,才能竞争成功;相互等待,导致死锁

2. delete导致死锁问题

和前面操作基本一致,只是第一个会话是删除记录

step1:

-- session1: 
begin; delete from t where id=1;

-- session2:
begin; insert into t values (1);
-- 阻塞

-- session3:
begin; insert into t values (1);
-- 阻塞

step2:

-- session1:
commit;

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

原因分析和前面基本一致

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

3. insert加锁逻辑

insert中对唯一索引的加锁逻辑

  1. 先做UK冲突检测,如果存在目标行,先对目标行加S Next Key Lock(该记录在等待期间被其他事务删除,此锁被同时删除)
  2. 如果1成功,对对应行加X + 插入意向锁
  3. 如果2成功,插入记录,并对记录加X + 行锁(有可能是隐式锁)

根据上面这个的逻辑,那么就会有一个有意思的死锁场景

step1:

-- session1
begin; delete from t where id = 1;


-- session2
begin; delete from t where id = 1;

step2:

-- session1
insert into t values(1)

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

对应的死锁日志

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

 

关于这个场景详情博文可以参考:记录一次Mysql死锁排查过程

4. 怎么避免死锁呢?

  • 将大事务拆成小事务
  • 添加合理的索引,走索引避免为每一行加锁,降低死锁的概率
  • 避免业务上的循环等待(如加分布式锁之类的)
  • 降低事务隔离级别(如RR -> RC 当然不建议这么干)
  • 并发插入时使用replace/on duplicate也可以避免死锁

三、总结

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激。

Mysql 死锁案例3-间隙锁与意向插入锁冲突 (16, 16,16)换成(3,3,3)即插入数据行的下一条记录有锁,但c=5这个记录锁是事务1加的,与事务1的意向插入锁不冲突,也是隐式锁。同一个事务持有 gap lock (临键锁也一样)的前提下插入数据,会发生锁分裂:执行T1,加锁情况是普通索引c临键锁(0,5]和间隙锁(5,10)写锁成功,加id=5主键记录锁写锁成功,共3把锁。执行T2,锁分裂,加锁情况成了(0,3)(3,5]和(5,10)以及主键id=5的记录锁。事务1持有(0,5)间隙锁写锁,事务申请(0,5)意向插入锁阻塞。 阅读详情

相关推荐

MySQL死锁套路:一次诡异的批量插入死锁问题分析

线上最近出现了批量insert的死锁,百思不得解。死锁记录如下: 2018-10-26T11:04:41.759589Z 8530809 [Note] InnoDB: *** (1) TRANSACTION: TRANSACTION 1202026765, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 1136, 3 row lock(s), undo log

m0_64354350的博客 3024

MySQL并发插入导致死锁

网关莫名奇妙的重试引发mysql并发插入,居然会导致了这样的神奇加锁逻辑,导致线上出现死锁问题。。。

云舒编程的博客 2413

5G NR切换测量事件解析:从A1到B2的实战应用指南

本文深入解析5G NR切换测量事件,从A1到B2的实战应用指南。详细介绍了系统内切换事件(A1-A6)和系统间切换事件(B1-B2)的触发条件与配置建议,帮助优化网络性能。通过实际案例分享,展示如何调整参数提升切换成功率和降低乒乓切换率,适用于5G网络优化工程师。

tcp8optimizer的博客 515

MySql只操作同一条记录,也会发生死锁吗?

为了避免这种问题的发生,可以在程序中设置获得锁的顺序,例如只能按照先获得主键索引 --> 普通索引的顺序获取锁,避免死锁的发生。如果刚好在这时,有另外一个线程已经拿到了当前主键索引的锁,同时尝试去在该事务中去拿记录的普通索引的锁。这时候就会发生死锁。当我们在事务中,更新一条记录的时候,如果用到普通索引作为条件,那么会先获取普通索引的锁,然后再尝试获取主键索引的锁。

weixin_44794897的博客 693

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1204

同步整流buck电路图设计:手把手入门必看

从零开始拆解同步整流Buck电路图及其原理,手把手带你画出关键拓扑、选型MOSFET、分析续流路径。重点讲清占空比控制逻辑与体二极管导通损耗的规避方法,让buck电路图及其原理真正落地可调、稳定可靠。

weixin_33308579的博客 997

MySQL之表锁、行锁、事务锁、gap锁、死锁案例详解

表锁、表锁 一、类型 r、x、IX、IS 对于表锁,只有X锁 二、产生条件 r锁:表示对表只读,任何用户都不能对表进行修改。在备份一个一致性表时,会在一瞬间产生表锁。通过lock table tbl_name read;来手动产生 x锁:DDL(drop、alter、truncate)会产生表锁,这个是排他锁,和其他所有的表锁都不兼容。通过lock table tbl_name wri...

weixin_44569143的博客 1852

免费,Python蓝桥杯等级考试真题--第10级(含答案解析和代码)

Python中蓝桥杯算是含金量和难度最大的比赛之一,网上可以找到不少真题,不过要么零零散散要么付费才能解锁,而且大都是没答案和解析的,给学习者造成很大困扰。因此本文档打算整理历年等级考试、STEMA、省赛、国赛真题卷和解析,供大家学习参考。

1579

并发写入导致死锁

Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 2021-09-15 19:36:25.932 [http-nio-100

Be_insighted的博客 972

5分钟快速验证lvgl界面:VScode模拟器极简配置法(免环境变量版)

本文介绍了一种5分钟快速验证LVGL界面的极简配置方法,使用VSCode模拟器免环境变量配置,适合UI设计师和产品经理快速预览界面效果。通过预编译的SDL2库和配置好的VSCode工程模板,实现开箱即用的LVGL界面验证,大幅提升工作效率。

weixin_30790841的博客 314

【YOLOv11多模态涨点改进】独家创新首发| TGRS 2026 |引入 CIFusion 通道交互融合模块,通过跨特征交互机制强化目标区域响应,适合多模态融合目标检测,小目标检测高效涨点

🔥本文提出了一种改进YOLOv11多模态目标检测模型的方法,通过引入CIFusion通道交互融合模块来提升RGB与红外特征融合效果。CIF模块采用通道级自适应交互机制,根据全局上下文动态分配不同模态通道的重要性,实现跨模态特征交互与互补信息融合。相比传统拼接或加权融合方式,CIF能够增强目标区域响应,抑制背景噪声,提高小目标和低对比度目标的检测性能。实验表明,该方法在DroneVehicle等数据集上显著提升了检测精度。论文还详细介绍了CIF模块的结构原理、实现代码及模型配置方法。

Ai缝合怪、助力小伙伴高效发论文 187

Mysql并发时经典常见的死锁原因及解决方法

1.mysql都有什么锁 MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 算法: next KeyLocks锁,同时锁住记录(数据),并且锁住记录前面的Gap Gap锁,不锁记录,仅仅记录前面的Gap Re...

没有伞的孩子必须努力奔跑!—小林 3632

华为 MetaERP 财务模块的核心业务对象,按子模块与架构维度分类,以表格呈现,适配架构设计与实施落地

华为MetaERP财务模块基于4A架构(业务/应用/数据/技术)与TOGAF框架,实现业财一体化与全球合规。业务架构涵盖组织模型与核心流程,应用架构支撑财务操作,数据架构确保数据一致性,技术架构提供高性能技术底座。模块覆盖总账、应收应付、资产等子模块,支持多组织、多币种、多准则核算,通过实时会计引擎实现"交易即核算"。4A架构与TOGAF框架对应,实现业务能力、应用组件、数据模型与技术栈的深度融合,为华为全球化财务核算提供核心支撑。

金牌架构师 443

一次并发插入死锁带来的 MySql 锁知识点整理

并发插入死锁引入的 MySql 锁知识点介绍最近遇到一个由于唯一性索引,导致并发插入产生死锁的场景,在分析死锁产生的原因时,发现这一块还挺有意思的,涉及到 MySql 中不少的知识点,特此总结记录一下。

程序员高级码农的博客 1593

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【MySQL系列】记插入产生的死锁问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 3万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

记录一次MySQL死锁的分析与解决过程

一、问题描述 上周开发过程中,线下环境遇到一个死锁问题,借此机会正好分析下MySQL死锁的原因和解决方案,本篇文章会带你去如何查看死锁日志和分析、解决。 二、MySQL死锁介绍 1、MySQL 锁种类 MySQL InnoDB存储引擎提供了如下几种锁: (1)共享/排他锁(S/X锁) 共享锁(S Lock):允许事务读取一行数据,多个事务可以拿到一把S锁(即读读并行); 排他...

noaman_wgs的博客 4万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MySQL——插入加锁/唯一索引插入死锁/批量插入效率

本篇主要介绍MySQL跟加锁相关的一些概念、MySQL执行插入Insert时的加锁过程、唯一索引下批量插入可能导致的死锁情况,以及分别从业务角度和MySQL配置角度介绍提升批量插入的效率的方法;

娜娜米的博客 1万+

并发插入引发的死锁问题排查

一.业务背景我们现在的业务是一款数据产品,有不少实时计算和爬取来的数据都汇总到大数据仓库、数据挖掘平台ODPS上。然后应用在读取这些数据时,这些数据会先导入到并发读能力更强,适合结构查询的mysql上。数据端开发的同学在跑定时任务时, tps比较高,于是出现了一些线上问题:在开发过程中发现对某一包含unique key(联合的唯一索引)的表进行并发插入的时候,出现大量的死锁,使得插入几乎无法进行。于

zhoxing 3万+

mysql并发插入死锁

mysql并发插入死锁 场景 多个线程同时执行条件插入语句 SQL: INSERT INTO system_lock (resource, owner, token, version, lock_time, release_time) SELECT ?, ?, ?, 0, ?, ? FROM DUAL WHERE NOT EXISTS(SELECT resource FROM system_lock WHERE resource = ?) 状态跟踪 执行命令查看 innodb 状态 show engine

qq_35425070的博客 3800

一次mysql死锁的排查过程

一次mysql死锁的排查过程

克终的博客 1万+

MySQL锁的总结 和 一次插入意向锁的死锁还原分析

Deadlock found when trying to get lock; try restarting transaction Insert Intention Locks LOCK_INSERT_INTENTION LATEST DETECTED DEADLOCK MySQL锁的总结 和 一次插入意向锁的死锁还原分析锁总结为什么要加锁?有什么锁?常见的三种锁常见的五种锁模式锁的兼容性如何分析死锁已经发生死锁正在阻塞中,等待锁释放。记一次死锁还原分析死锁总结

demo 2800

MySQL自增字段并发插入导致死锁

MySQL带自增字段的表在并发插入时发生死锁 问题 'int' object has no attribute 'encode'", <class 'mysql.connector.errors.InternalError'>, (1213, '1213 (40001): Deadlock found when trying to get lock; try restarting tr...

CommanderZero的博客 3199

[MySQL]-死锁案例-唯一索引上的并发插入

死锁,是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程。要找到问题的原因所在,解决自己的盲区问题的复现也要做到准确,去寻找技巧问题的解决需要真正做到可行,但同时也需要理清方案的优缺点。

liangsena的博客 3772

记一次Mysql并发"死锁",引出的问题及讨论

本人原文地址:记一次Mysql并发"死锁",引出的问题及讨论 这几天,在查看文章时,发现了一个Mysql并发的问题,在一开始仅仅凭借眼睛去查看时,并未发现问题及解决方法,于是我们对其进行了具体实际操作和测试: 一、问题 一个事务内:insert记录后根据字段p来update这条记录,然而当出现并发操作的时候,update处会发生dead lock问题,把update改为id,就没事了。 同一...

Ops的博客 360
上一篇: 不怕面试再问HashMap,一次彻底地梳理(原理+手写实现)
下一篇: 追根溯源,有点意思,关于MySQL更新“丢失”问题
爱玛士
博客等级 码龄7年 720粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值