项目中遇到的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

基于 LSTM 的船舶轨迹预测,单步预测

基于 LSTM 的船舶轨迹预测,单步预测

fyuhao的博客 1万+

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

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

weixin_42361070的博客 167

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 327

等保三级-MySQL 安全加固实战指南

本文详细介绍了MySQL数据库在等保三级要求下的安全加固实战指南,涵盖身份鉴别、访问控制、安全审计、网络传输安全、入侵防范和数据完整性等关键领域。通过具体配置示例和实战经验,帮助用户有效提升MySQL数据库的安全防护能力,满足等保三级合规要求。

weixin_29197835的博客 183

mysql 行锁 并发_mysql 并发 行锁 inoodb

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

weixin_39610085的博客 428

《Ventoy 制作系统安装 U 盘的具体步骤》

然后您可以在电脑的磁盘管理中对 U 盘进行快速格式化,选择 FAT32 或 NTFS 文件系统。至此,Ventoy 系统安装 U 盘就制作完成了。您可以在需要安装系统的电脑上,从 U 盘启动,然后选择相应的系统镜像进行安装。安装完成后,将您需要的操作系统镜像文件(如 Windows、Linux 等的 ISO 格式镜像)复制到 U 盘的根目录。在安装程序中,选择您插入的 U 盘设备,确保选择正确,以免误操作。2. 确认选择的 U 盘盘符正确,防止误操作导致其他磁盘数据丢失。点击“安装”按钮,等待安装完成。

jiyiwangluokeji的博客 2669

mysql死锁 DeadLock定位与解决

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

进化的深山猿 2万+

PIDNet实战:如何在Cityscapes数据集上实现93.2 FPS的实时语义分割(附完整训练代码)

本文提供了在Cityscapes数据集上实现实时语义分割模型PIDNet的完整工程实践指南。PIDNet凭借其独特的比例-积分-微分三分支架构,在CVPR 2023上取得了速度与精度的出色平衡。文章详细介绍了从环境配置、数据预处理、模型训练到性能优化与部署的全流程,并分享了实现93.2 FPS高推理速度的关键技巧与代码。

weixin_29047919的博客 375

基于工作流的低代码AI应用开发:Flock平台核心架构与实战指南

在AI应用开发领域,工作流编排正成为连接大语言模型(LLM)能力与复杂业务逻辑的关键技术。其核心原理是将任务分解为模块化节点,通过可视化方式定义执行顺序与数据流向,从而实现灵活可控的自动化流程。这种范式极大地提升了开发效率,降低了技术门槛,使得开发者能够聚焦于业务设计而非底层代码。在技术价值层面,工作流编排支持检索增强生成(RAG)、多智能体协作等高级模式,并能通过人工干预节点确保关键流程的可靠性与合规性。其典型应用场景包括智能客服、自动化办公、数据分析助手等。本文以Flock平台为例,深入解析了如何利用其

weixin_26848497的博客 381

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

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

迪曼奥特迦-博客 2万+

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | ICML 2024 | RT-DETR引入ICB交互式卷积模块和ASB自适应频谱模块,助力目标检测、异常检测有效涨点、含多种创新改进点

RT-DETR目标检测模型通过引入ICB和ASB模块实现性能提升。ICB模块采用多尺度卷积交互,有效捕获局部和长程依赖特征;ASB模块通过自适应频域滤波优化特征表示,降低噪声干扰。两者结合使模型在复杂场景中表现更优,显著提升检测精度和鲁棒性。文章详细介绍了模块原理、代码实现及配置方法,并提供了8种改进版本的YAML配置文件,适用于不同网络结构。这些创新改进为RT-DETR模型提供了高效涨点方案,特别适合复杂背景和高噪声环境下的目标检测任务。

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

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

mysql deadLock

a1k2l45k的博客 5万+

Multica 自托管部署与使用入门:从上线到让 AI Agent 真正干活

Multica是一个将AI Agent作为团队成员的任务协作平台,支持自托管部署。本文介绍了完整的单机部署流程: 核心架构包括前端界面、后端服务、PostgreSQL数据库和Runtime执行机器 推荐使用Docker Compose部署,需配置数据持久化目录 提供详细的docker-compose.yml和.env配置文件说明 重点注意事项:数据库密码和JWT密钥必须修改,生产环境配置必须设为production 需正确配置前端访问地址和WebSocket连接 部署完成后,用户可创建AI Agent并将其

q742971636的博客 1713

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MySQL行锁深入研究

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

闲余知道 1584

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

Seina 6347

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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、付费专栏及课程。

余额充值