项目中遇到的MySql行锁与并发性关系(3)--发生deadlock的原因

MySQL 锁详解:从原理到实战的并发控制指南 本文系统解析了 MySQL 锁机制的核心原理与最佳实践。首先,锁按粒度分为全局锁、表锁和行锁,按功能分为共享锁和排他锁,不同锁的兼容性不同。InnoDB 存储引擎通过行锁、意向锁、间隙锁和临键锁实现并发控制,确保数据一致性。锁竞争和死锁是常见问题,可通过优化事务逻辑、设置超时时间等方式解决。优化锁的使用包括合理使用索引、减少锁持有时间、选择乐观锁或悲观锁等策略。不同存储引擎的锁行为有所差异,InnoDB 支持行锁和事务,而 MyISAM 和 Memory 仅支持表锁。实战案例中,通过行锁和条件更新优化库存扣 阅读详情

重点到了!发生deadlock的原因:

deadlock是死锁,一般发生的原因就是两个同时加上事务的连接互相UPDATE对方的加锁行,导致互相等待,这样的操作逻辑上会永远执行下去,这应该就是死锁的概念,但是数据库不会让这种情况真正发生,当判断出发生这种情况的时候MySql会先中断并且回滚后执行的连接并且报deadlock异常,同时允许先进行DML操作的连接,示例如下:

然后在连接1中加事务和对表TEST_ALR的ID=1行加行锁

SET autocommit=0;
SELECT * FROM TEST_ALR WHERE ID=1 FOR UPDATE;

然后在连接2中加事务和对表TEST_ALR的ID=2行加行锁,同时把ID=4的行进行UPDATE操作

SET autocommit=0;
SELECT * FROM TEST_ALR WHERE ID=2 FOR UPDATE;
UPDATE TEST_ALR SET NAME='ABC' WHERE ID=4;

此时都执行成功了,这两个连接之间也没有影响

此时在连接1中对ID=2行进行UPDATE,出现等待,在没报等待超时之前在连接2中对ID=1行进行UPDATE:

UPDATE TEST_ALR SET NAME='TEST2' WHERE ID=2;
Deadlock found when trying to get lock; try restarting transaction

出现deadlock异常,说明发生了之前描述的情况

查看TEST_ALR表ID=4的数据:

SELECT * FROM TEST_ALR WHERE ID=4;
ID NAME
4 赵六

发现已经回滚

再切回连接1查看,发现此时连接1的UPDATE赢成功执行完成:

1 row(s) affected


之前的项目因为需要用到并发,所以需要并发的CALL存储过程,当时的过程写的存在一些问题,行锁是上对了,但是加完行锁之后,后面的UPDATE操作不是以索引列为条件,所以造成了虽然连接中最开始写的行锁是加的行锁,但是到UPDATE操作的时候还是想对当前表进行表级锁操作,但是另外一个连接中也同时对此表加行级锁了,所以要等待行级锁事务解除,这边才能继续执行UPDATE操作,但是另外一边因为是CALL的同一个过程,所以也是会出现一个一模一样的UPDATE操作,所以这两个连接之间出现了互相等待的情况造成了死锁,示例如下:

现在连接1和连接2都加上事务和不同行的行锁:

连接1:

SET autocommit=0;
SELECT * FROM TEST_ALR WHERE ID=1 FOR UPDATE;

连接2:

SET autocommit=0;
SELECT * FROM TEST_ALR WHERE ID=2 FOR UPDATE;

此时在连接1中以NAME当做条件对TEST_ALARM的进行UPDATE(张三在表中其实是唯一的,但是不是索引列):

UPDATE TEST_ALR SET NAME ='张三1' WHERE NAME='张三';

发现出现等待,在未超时的时候在连接2中执行同样原理的UPDATE:

UPDATE TEST_ALR SET NAME ='TEST' WHERE NAME='TEST';

出现死锁异常:

EooroCode:1213

Deadlock found when trying to get lock; try restarting transaction

在切回连接1中:

1 row(s) affected
其实在TEST_ALR表中的NAME字段的'张三'和'TEST'是分别对应着自己所在行的数据,但是当你的UPDATE操作条件不是根据索引列操作的话,数据库不会去实际读取表中的数据,所以数据库并不知道你的条件是否在之前加的行锁的范围内,或者说因为UPDATE操作的条件不是索引列,所以会重新对表加上表级锁,导致的互相等待造成的deadlock;




MySQL报错「Deadlock found when trying to get lock」:事务隔离级别与锁等待超时的调优 核心治理原则分层防护:在应用层、数据库层、网络层实现多级死锁预防动态调优:基于监控数据动态调整隔离级别与超时时间灰度发布:新功能上线前在小流量环境验证锁行为。 阅读详情

相关推荐

MySQL死锁的发生原因和怎么避免

MySQL中的死锁是指两个或多个事务在执行时互相等待对方持有的锁,导致所有事务都无法继续执行下去,最终需要回滚一个事务才能打破死锁。死锁通常发生在并发事务较多的环境中,特别是在涉及多个表或多行记录的情况下。

有时间就写写代码 966

MYSQL 行锁、表锁并发问题

转载自:http://jianwl.com/2017/03/27/MYSQL%E4%B9%8B%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98/   前言 MYSQL很少在单用户环境下使用,通常它会同时处理很多的连接线程,这些线程来自不同的用户,执行不同的任务。这些并行连接可能访问同样的数据库和表,所以当某个连接发生问题的时候,很难判断数据库的状态。 MYSQL服务...

拉丁解牛技术专栏 5956

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 345

mysql免费song_MySQL高级【六】MySQL 锁 Song

MySQL 锁锁概述锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。在数据库中,除传统的计算资源(如 CPU、RAM、I/O 等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。锁分类从对数据操作的粒度分 :表锁:操作时,会锁定整个表。行锁:操作时,会锁定当前操作行。从...

weixin_42361070的博客 167

保姆级教程:QGC地面站Vehicle Setup全模块配置详解(从固件升级到安全设置)

本文提供QGC地面站Vehicle Setup全模块配置的保姆级教程,涵盖从固件升级到安全设置的完整流程。详细解析二次开发环境准备、传感器校准、飞行模式配置等关键步骤,帮助用户快速掌握无人机配置技巧,确保飞行安全与性能优化。

weixin_28726671的博客 387

三极管特性曲线看不懂?手把手教你用Multisim仿真分析放大电路频率响应

本文针对模拟电路初学者,详细讲解如何利用Multisim软件进行电路仿真,将抽象的三极管特性曲线与放大电路频率响应分析变得直观可视。通过手把手教学,指导读者从导入三极管SPICE模型、仿真输出特性曲线,到分析动态工作点,最终使用波特图仪深入分析频率响应并进行补偿设计,有效帮助理解电路原理并指导实践调试。

weixin_29230059的博客 122

mysql 行锁 并发_mysql 并发 行锁 inoodb

http://www.cnblogs.com/hitwtx/archive/2011/09/12/2174297.html1. 锁是数据库区别于文件系统的重要特性之1,锁机制用于管理对共享文件的并发访问innodb使用的是行级锁myisam,使用的是表级锁,在并发条件下,读操作没有问题,但是并发插入会有性能上的影响sql server 2005之前的版本都是页级锁的,相对于myisam言,并发访问...

weixin_39610085的博客 428

5分钟搞定:用Ollama在MacBook上本地运行Qwen3大模型(附避坑指南)

本文详细介绍了如何在MacBook上使用Ollama快速部署和运行Qwen3大模型,包括安装步骤、性能优化技巧及常见问题解决方案。Ollama作为一款轻量级工具,特别适合M系列芯片的Mac用户,支持多种量化版本,显著降低资源消耗,提升推理速度。

sql99的博客 822

mysql死锁 DeadLock定位与解决

mysql死锁问题定位与解决 java后台报错如下 java.util.concurrent.ExecutionException: org.springframework.dao.DeadlockLoserDataAccessException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQ...

进化的深山猿 2万+

ArcGIS | 全球新冠肺炎地图数据下载和处理

ArcGIS

thinkpang的博客 2901

电力-平衡式IEC 60870-5-101规约报文解析

本文详细介绍了电力自动化中平衡式IEC 60870-5-101规约的应用,包括链路建立与初始化、对时、遥控操作、数据上送和总召唤等关键步骤,通过实例解析了报文格式和交互过程,是理解配网自动化通信的重要参考资料。

让你爱上电路设计 5685

MySQL - 死锁的产生及解决方案

死锁是指2+的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。@百度百科。

迪曼奥特迦-博客 2万+

YOLOv11与CLIP融合的零样本目标检测技术:原理、实现与创新实践

YOLO(You Only Look Once)系列作为单阶段检测器的代表,以其实时高效的特性在工业界获得广泛应用。YOLOv11作为该系列的最新演进,引入了多项架构创新: C3K2模块:采用双小卷积核替代传统大卷积核,在保持感受野的同时减少计算量。当参数c3k=False时退化为YOLOv8的C2F模块,提供灵活的精度-效率权衡。 C2PSA(Convolutional block with Parallel Spatial Attention):通过并行空间注意力机制增强对微小目标的特征提取能力,这对

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1068

Mysql报Deadlock found when trying to get lock; try restarting transaction问题解决

mysql deadLock

a1k2l45k的博客 5万+

MySQL操作之用户管理权限管理:(DC)(五)

一、简介 二、用户管理 2.1 User表 2.2 创建普通用户 2.3 删除普通用户 2.4 修改用户密码 2.5 解决root用户密码丢失 三、权限管理 3.1 MySQL的权限 3.2 授予权限 3.3 查看权限 3.4 收回权限

lydms的博客 4507

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MySQL行锁深入研究

MySQL 的行锁机制是保证数据库并发控制的核心特性之一,尤其在 InnoDB 存储引擎中实现得较为复杂。以下从技术角度深入剖析 MySQL 行锁的工作原理、类型及实际应用中的注意事项

闲余知道 1584

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

MySQL 行锁、两阶段锁协议、死锁以及死锁检测

行锁 MySQL的行锁都是在引擎层实现的,但是 MyISAM 不支持行锁,意味着并发控制只能使用表锁,同一张表任何时刻只能被一个更新在执行,影响到业务并发度。InnoDB 是支持行锁的,这也是 MyISAM 被 InnoDB 替换的重要原因之一。 行锁就是针对数据库中表的行记录的锁,这很好理解,比如事务 A 更新了一行,而这时候,事务 B 也要更新一行,则必须等事务 A 的操作完成后才能更新。...

Seina 6347

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MYSQL遇到Deadlock found when trying to get lock,解决方案

最近遇到一个MYSQL update语句出现Deadlock found when trying to get lock的问题,分析一下原因。什么情况下会出现Deadlock found when trying to get lock?https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlocks.html出现死锁需要2个条件:1)至少2个clie...

zhibin的程序日记 13万+

初学MySQL—全局锁、表锁、行锁

初学MySQL-全局锁和表锁全局锁使用场景为何不使用readonly表级锁表锁元数据锁(metadata lock) 数据库中表设计的初衷就是处理并发问题,当出现并发访问的时候,锁就是数据集库用来合理控制访问资源的访问规则。 根据加锁的范围,MySQL中的锁大致分为全局锁、表级锁和行锁。 全局锁 全局锁就是对整个数据库实例加锁,MySQL中提供的加锁的命令是: Flush tables with ...

ghw15221836342的博客 661

MySql全局锁,表级锁和行锁

MySql全局锁表级锁表锁元数据锁行锁 全局锁 顾名思义,全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命 令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括 建表、修改表结构等)和更新类事务的提交语句。 全局局锁的的典型使用场景是,做全库逻辑备份。。也就是把整库每个表都select出来存成文本。 FTWRL 前有读写的话

qq_42712251的博客 629

MySQL 锁详解:表锁、行锁、间隙锁、Next-Key、死锁一次看个透

ACID└─ 隔离级别├─ RU(无Gap)├─ RC(无Gap)└─ Serializable(全表NK)锁类型├─ S / X├─ IS / IX(表级意向)└─ 表锁(LOCK TABLES)加锁算法MVCC└─ 快照读(无锁)└─ 当前读(S/X + NK)【腾讯文档】MYSQL锁mode=mind。

weixin_44551234的博客 1611

mysql实战07 | 行锁功过:怎么减少行锁对性能的影响?

在上一篇文章中,我跟你介绍了 MySQL 的全局锁和表级锁,今天我们就来讲讲 MySQL 的行锁。MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB 是支持行锁的,这也是 MyISAM 被 InnoD...

weixin_34075551的博客 502

MySQL| 行锁功过:怎么减少行锁对性能的影响?

在上一篇文章中,我跟你介绍了 MySQL 的全局锁和表级锁,今天我们就来讲讲 MySQL 的行锁。MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支...

sinat_27143551的博客 987

mysql 如何触发行锁_MySQL的锁到底有多少内容 ?再和腾讯大佬的技术面谈,我还是小看锁了!...

对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之时乃我心之痛,难到是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一紧。正处为难之间,手机忽然来了个短信预约后续面试。我即刻三下五除二拎包踢门而出。飞奔而去。此刻面试门外首先映入眼帘的是一个白色似皮球的东西,似圆非圆。好奇冬瓜落地一般。上半段还有一段湿湿的部分...

weixin_29609733的博客 769

mysql45讲阅读笔记行锁(7)

顾名思义,行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而 这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。行锁容易出现死锁,需要注意,尽量减少行锁使用时间。 当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会 导致这几个线程都进入无限等待的状态,称为死锁。这里我用数据库中的行锁举个例子。在 In

m0_46392035的博客 159
上一篇: 项目中遇到的MySql行锁与并发性关系(2)
下一篇: GBase 8s v8.8数据库的安装(安装准备)
Kael Z
博客等级 码龄15年 9粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值