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

Claude Code 实战指南:用 AI 玩转终端编程,效率狂飙!

本文介绍了终端 AI 代理工具 Claude Code,涵盖常用命令、使用方法(如 init 初始化、权限配置、工作流程、上下文管理)、MCP 扩展工具及实战案例,展示其通过自然语言辅助开发的高效性与实用性。

个人技术 1万+

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

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

weixin_42361070的博客 167

别再只盯着MES了!半导体/面板厂CIM系统全家桶(EAP/YMS/SPC)保姆级入门指南

本文深入解析半导体制造中的CIM系统,涵盖EAP、YMS和SPC等关键子系统的协同工作。通过实战案例和技术细节,展示如何利用CIM系统提升生产效率、良率管理和设备维护,为半导体/面板厂提供全面的实施指南和优化策略。

weixin_33693070的博客 464

合宙Air780EP速连OneNET:AT+MQTT应用指南

本文详细讲解了合宙Air780EP使用AT指令通过MQTT接入OneNET的过程。

2401_82812461的博客 1390

mysql 行锁 并发_mysql 并发 行锁 inoodb

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

weixin_39610085的博客 428

杰理可视化SDK开发-杰理AC1123N芯片SDK开发笔记合集

该文档主要描述 AC112N开发相关的使用说明和注意事项,收集并持续更新开发调试过程中的相关疑问和解答,对SDK介绍文档做一个补充说明。写作人:李永奉,参考项目MD-026H; AC112N-SDK项目帮助文档在杰理开发者平台(JL DP)'帮助'处进入,如本文档有与后续帮助文档或工具注释说明冲突,以后者为标准。

李永奉的博客 182

mysql死锁 DeadLock定位与解决

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

进化的深山猿 2万+

SolidWorks_模具设计5_分型线生成

分型线是模具设计的核心要素,直接影响产品质量、脱模可行性和制造成本。本文系统介绍了分型线生成技术,包括三种核心算法:基于凸包的方法适用于简单几何,可见性分析处理复杂曲面,曲率特征优化则能找到自然分界。文章提供了完整的Python实现示例,涵盖点云投影、网格处理和分型线评估等关键技术。通过理解这些原理和方法,工程师可以更高效地设计出满足外观要求、易于加工的分型线方案,显著提升模具设计质量和效率。

H17853509096的博客 179

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

安装这个软件之前先安装VisualStudio,本文安装这个软件时已经安装了VisualStudio2019。1、下载倍福PLC编程软件TwinCAT。

qq_34059233的博客 3664

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

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

迪曼奥特迦-博客 2万+

在 MATLAB/Simulink 中构建一个卫星间激光通信链路的完整仿真系统

摘要: 本文通过Simulink详细演示了卫星间激光通信系统的建模过程,重点分析其在10Gbps高速率、2000km距离下的性能。系统设计涵盖PAM-4调制、自由空间信道建模(路径损耗、指向误差、多普勒效应)、APD探测及链路预算计算,并给出典型场景下18.5dB SNR、1e-9误码率的仿真结果。针对激光通信的μrad级指向精度挑战,提出AI辅助跟踪、混合RF/激光等优化策略,为未来太空高速组网提供可扩展的仿真框架。所需工具箱包括Communications Toolbox和Aerospace Toolb

xiaoheshang_123的博客 383

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

mysql deadLock

a1k2l45k的博客 5万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MySQL行锁深入研究

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

闲余知道 1584

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

Seina 6347

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

余额充值