MySQL死锁分析与解决之路

MySQL死锁的分析与解决方案 死锁(Deadlock)是指在多个事务执行过程中,事务之间由于相互等待,形成了一个循环依赖的情况,导致这些事务无法继续执行,进而造成系统的阻塞。MySQL死锁是数据库高并发场景中常见的性能瓶颈问题,解决死锁的关键在于合理设计事务,优化数据库索引,并加强应用层的事务管理。通过统一事务的访问顺序、合理使用索引、限制事务时间等预防策略,可以大幅减少死锁的发生。同时,当死锁发生时,自动重试机制和合理的事务隔离级别调整也可以帮助系统有效地应对死锁,确保数据库的稳定性和性能。 阅读详情

​

咱们使用 MySQL 大概率上都会遇到死锁问题,这实在是个令人非常头痛的问题。本文将会对死锁进行相应介绍,对常见的死锁案例进行相关分析与探讨,以及如何去尽可能避免死锁给出一些建议。

--什么是死锁 --

死锁是并发系统中常见的问题,同样也会出现在数据库MySQL的并发读写请求场景中。当两个及以上的事务,双方都在等待对方释放已经持有的锁或因为加锁顺序不一致造成循环等待锁资源,就会出现“死锁”。常见的报错信息为 ” Deadlock found when trying to get lock... ”。

举例来说 A 事务持有 X1 锁 ,申请 X2 锁,B事务持有 X2 锁,申请 X1 锁。A 和 B 事务持有锁并且申请对方持有的锁进入循环等待,就造成了死锁。

​

如上图,是右侧的四辆汽车资源请求产生了回路现象,即死循环,导致了死锁。

从死锁的定义来看,MySQL 出现死锁的几个要素为:

a.两个或者两个以上事务

b.每个事务都已经持有锁并且申请新的锁

c.锁资源同时只能被同一个事务持有或者不兼容

d.事务之间因为持有锁和申请锁导致彼此循环等待

说明:后续内容实验环境为 5.7 版本,隔离级别为 RR(可重复读)

-- InnoDB 锁类型--

为了分析死锁,我们有必要对 InnoDB 的锁类型有一个了解。

​

MySQL InnoDB 引擎实现了标准的行级别锁:共享锁( S lock ) 和排他锁 ( X lock )

  • 不同事务可以同时对同一行记录加 S 锁。

  • 如果一个事务对某一行记录加 X 锁,其他事务就不能加 S 锁或者 X 锁,从而导致锁等待。

如果事务 T1 持有行 r 的 S 锁,那么另一个事务 T2 请求 r 的锁时,会做如下处理:

  • T2 请求 S 锁立即被允许,结果 T1 T2 都持有 r 行的 S 锁

  • T2 请求 X 锁不能被立即允许

如果 T1 持有 r 的 X 锁,那么 T2 请求 r 的 X、S 锁都不能被立即允许,T2 必须等待 T1 释放 X 锁才可以,因为 X 锁与任何的锁都不兼容。共享锁和排他锁的兼容性如下所示:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

间隙锁( gap lock )

间隙锁锁住一个间隙以防止插入。假设索引列有2, 4, 8 三个值,如果对 4 加锁,那么也会同时对(2,4)和(4,8)这两个间隙加锁。其他事务无法插入索引值在这两个间隙之间的记录。但是,间隙锁有个例外:

  • 如果索引列是唯一索引,那么只会锁住这条记录(只加行锁),而不会锁住间隙。

  • 对于联合索引且是唯一索引,如果 where 条件只包括联合索引的一部分,那么依然会加间隙锁。

next-key lock

next-key lock 实际上就是 行锁+这条记录前面的 gap lock 的组合。假设有索引值10,11,13和 20,那么可能的 next-key lock 包括:

(负无穷,10]

(10,11]

(11,13]

(13,20]

(20,正无穷)

在 RR 隔离级别下,InnoDB 使用 next-key lock 主要是防止幻读问题产生。

意向锁( Intention lock )

InnoDB 为了支持多粒度的加锁,允许行锁和表锁同时存在。为了支持在不同粒度上的加锁操作,InnoDB 支持了额外的一种锁方式,称之为意向锁( Intention Lock )。意向锁是将锁定的对象分为多个层次,意向锁意味着事务希望在更细粒度上进行加锁。意向锁分为两种:

  • 意向共享锁( IS ):事务有意向对表中的某些行加共享锁

  • 意向排他锁( IX ):事务有意向对表中的某些行加排他锁

由于 InnoDB 存储引擎支持的是行级别的锁,因此意向锁其实不会阻塞除全表扫描以外的任何请求。表级意向锁与行级锁的兼容性如下所示:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

插入意向锁( Insert Intention lock )

插入意向锁是在插入一行记录操作之前设置的一种间隙锁,这个锁释放了一种插入方式的信号,即多个事务在相同的索引间隙插入时如果不是插入间隙中相同的位置就不需要互相等待。假设某列有索引值2,6,只要两个事务插入位置不同(如事务 A 插入3,事务 B 插入4),那么就可以同时插入。

锁模式兼容矩阵

横向是已持有锁,纵向是正在请求的锁:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

--阅读死锁日志--

一个温馨小提示: xmen 平台支持查看死锁主库的死锁日志,访问方式如下:

登录 https://xmen.intra.ke.com/#/mysql/mysql-cluster 点击集群管理 -> 输入集群端口 -> 工具集合 -> 查看死锁日志 点击查询即可查看最近一次死锁日志。

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

在进行具体案例分析之前,咱们先了解下如何去读懂死锁日志,尽可能地使用死锁日志里面的信息来帮助我们来解决死锁问题。

后面测试用例的数据库场景如下:

MySQL 5.7 事务隔离级别为 RR

表结构和数据如下:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

测试用例如下:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

通过执行show engine innodb status 可以查看到最近一次死锁的日志。

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

日志分析如下:

*** (1) TRANSACTION:

TRANSACTION 2322, ACTIVE 6 sec starting index read

事务号为2322,活跃 6秒,starting index read 表示事务状态为根据索引读取数据。常见的其他状态有:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

mysql tables in use 1 说明当前的事务使用一个表。

locked 1 表示表上有一个表锁,对于 DML 语句为 LOCK_IX

LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)

LOCK WAIT 表示正在等待锁,2 lock struct(s) 表示 trx->trx_locks 锁链表的长度为2,每个链表节点代表该事务持有的一个锁结构,包括表锁,记录锁以及自增锁等。本用例中 2locks 表示 IX 锁和lock_mode X (Next-key lock)

1 row lock(s) 表示当前事务持有的行记录锁/ gap 锁的个数。

MySQL thread id 37, OS thread handle 140445500716800, query id 1234 127.0.0.1 root updating

MySQL thread id 37 表示执行该事务的线程 ID 为 37 (即 show processlist; 展示的 ID )

delete from student where stuno=5 表示事务1正在执行的 sql,比较难受的事情是 show engine innodb status 是查看不到完整的 sql 的,通常显示当前正在等待锁的 sql。

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 11 page no 5 n bits 72 index idx_stuno of table `cw`.`student` trx id 2322 lock_mode X waiting

RECORD LOCKS 表示记录锁, 此条内容表示事务 1 正在等待表 student 上的 idx_stuno 的 X 锁,本案例中其实是 Next-Key Lock 。

事务2的 log 和上面分析类似:

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 11 page no 5 n bits 72 index idx_stuno of table `cw`.`student` trx id 2321 lock_mode X

显示事务 2 的 insert into student(stuno,score) values(2,10) 持有了 a=5 的 Lock mode X

| LOCK_gap,不过我们从日志里面看不到事务2执行的 delete from student where stuno=5;

这点也是造成 DBA 仅仅根据日志难以分析死锁的问题的根本原因。

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 11 page no 5 n bits 72 index idx_stuno of table `cw`.`student` trx id 2321 lock_mode X locks gap before rec insert intention waiting

表示事务 2 的 insert 语句正在等待插入意向锁 lock_mode X locks gap before rec insert intention waiting ( LOCK_X + LOCK_REC_gap )

--经典案例分析--

案例一:并发申请 gap 锁导致死锁

表结构和数据如下所示:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

测试用例如下(本测试用例场景是两个事务删除不存在的行,然后再 insert 记录):

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

死锁日志如下所示:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

死锁日志分析如下:

重点说明下 delete 不存在的记录是要加上 gap 锁, 事务日志中显示lock_mode X locks gap before rec .

1. T2:delete from t4 where kdt_id=15 and admin_id= 1 and biz='retail' and role_id=1; 符合条件的

记录不存在,导致T2先持有了( lock_mode X locks gap before rec ) 锁住

[(2,20,1,1,’ratail’,1,0)-(3,30,1,’retail’,1,0)]的区间,防止符合条件的记录插入。

2. T1 的 delete 与 T1 的 delete 一样同样申请了( lock_mode X locks gap but rec ) 锁住了

[(2,20,1,'retail',1,0)-(3,30,1,'retail',1,0)]的区间。

3. T1 的 insert 语句申请插入意向锁,但是插入意向锁和 T2 持有的 X gap ( lock_mode X locks gap before rec ) 冲突,故等待 T2 中的 gap 锁释放。

4. T2 的 insert 语句申请插入意向锁,但是插入意向锁和 T1 持有 X gap (lock_mode X locks gap before rec )冲突,故等待T1中的 gap 锁释放。

总结来说,就是 T1 (insert) 等待 T2 (delete) , T2 (insert) 等待 T1 (delete) 故而循环等待,出现死锁。

案例二:事务并发 insert 唯一键冲突

表结构和数据如下所示:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

测试用例如下:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

死锁日志如下:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

日志分析如下:

1.事务 T2 insert into t7(id,a) values (26,10) 语句 insert 成功,持有 a=10 的 排他行锁( X

locks rec but no gap )

2.事务 T1 insert into t7(id,a) values (30,10), 因为T2的第一条 insert 已经插入 a=10 的记录,

事务 T1 insert a=10 则发生唯一键冲突,需要申请对冲突的唯一索引加上S Next-key Lock

( 即 lock mode S waiting ) 这是一个间隙锁会申请锁住(,10],(10,20]之间的 gap 区域。

3.事务 T2 insert into t7(id,a) values (40,9)该语句插入的 a=9 的值在事务 T1 申请的 gap 锁

[4,10]之间, 故需事务 T2 的第二条 insert 语句要等待事务 T1 的 S-Next-key Lock 锁释放,

在日志中显示 lock_mode X locks gap before rec insert intention waiting 。

案例三:普通索引和主键相互竞争导致循环等待

表结构和数据如下所示:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

测试用例如下:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

死锁日志:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

死锁日志分析:

首先要理解的是 对同一个字段申请加锁是需要排队的。

其次表tx中索引 idx_c1 为非唯一普通索引。

(1). T2 执行 select for update 操作持有记录 id=30 的主键行锁:PRIMARY of table `test`.`tx` trx id 2077 lock_mode X locks rec but not gap。

(2). T1 语句 update 通过普通索引 idx_c1 更新 c2,先获取 idx_c1 c1=5 的 X 锁 lock_mode X locks rec but not gap, 然后去申请对应主键 id=30 的行锁, 但是 T2 已经持有主键的行数,于是 T1 等待。

(3). T2 执行根据主键 id=30 删除记录,需要申请 id=30 的行锁以及 c1=5 的索引行锁。但是 T1 以及持有该锁, 故会出现 index idx_c1 of table `test`.`tx` trx id 2077 lock_mode X locks rec but not gap waiting .

T2(delete) 等待 T1(update), T1(update) 等待 T2 (select for update)循环等待,造成死锁。

案例四:先 update 再 insert 的并发死锁问题

表结构如下,无数据:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

测试用例如下:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

死锁日志如下:

​

编辑切换为居中

添加图片注释,不超过 140 字(可选)

死锁分析:

可以看到两个事务 update 不存在的记录,先后获得间隙锁( gap 锁),gap 锁之间是兼容的所以在update环节不会阻塞。两者都持有 gap 锁,然后去竞争插入意向锁。当存在其他会话持有 gap 锁的时候,当前会话申请不了插入意向锁,导致死锁。

--如何尽可能避免死锁--

1.合理的设计索引,区分度高的列放到组合索引前面,使业务 SQL 尽可能通过索引定位更少的行,减少

锁竞争。

2.调整业务逻辑 SQL 执行顺序, 避免 update/delete 长时间持有锁的 SQL 在事务前面。

3.避免大事务,尽量将大事务拆成多个小事务来处理,小事务发生锁冲突的几率也更小。

4.以固定的顺序访问表和行。比如两个更新数据的事务,事务 A 更新数据的顺序为 1,2;事

务 B 更新数据的顺序为 2,1。这样更可能会造成死锁。

5.在并发比较高的系统中,不要显式加锁,特别是是在事务里显式加锁。如 select … for

update 语句,如果是在事务里(运行了 start transaction 或设置了autocommit 等于0),

那么就会锁定所查找到的记录。

6.尽量按主键/索引去查找记录,范围查找增加了锁冲突的可能性,也不要利用数据库做一些

额外额度计算工作。比如有的程序会用到 “select … where … order by rand();”

这样的语句,由于类似这样的语句用不到索引,因此将导致整个表的数据都被锁住。

7.优化 SQL 和表设计,减少同时占用太多资源的情况。比如说,减少连接的表,将复杂 SQL

分解为多个简单的 SQL。

手把手教你分析解决MySQL死锁问题 在生产环境中如果出现MySQL死锁问题该如何排查和解决呢,本文将模拟真实死锁场景进行排查,最后总结下实际开发中如何尽量避免死锁发生。 一、准备好相关数据和环境 当前自己的数据版本是8.0.22 mysql> select @@version; +-----------+ | @@version | +-----------+ | 8.0.22 | +-----------+ 1 row in set (0.00 sec) 数据库隔离级别(默认隔离级别) mysql>... 阅读详情

相关推荐

pytorch-cifar100学习资料汇总 - 基于PyTorch的CIFAR-100图像分类实践

pytorch-cifar100是一个基于PyTorch实现CIFAR-100数据集图像分类的开源项目。该项目实现了多种经典的深度学习网络模型,如ResNet、DenseNet、VGG等,为开发者提供了在CIFAR-100数据集上进行图像分类实验的代码范例。pytorch-cifar100项目为我们提供了在CIFAR-100数据集上进行图像分类实验的完整代码实现。无论你是想要学习PyTorch的使用,还是研究不同网络模型在CIFAR-100上的表现,这个项目都是一个很好的起点。

helloaiworld的博客 1126

记一次神奇的Mysql死锁排查

背景说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对于一些基本的Mysql锁或者死锁都有一个简单的认识,可以看下这篇文章为什么开发人员需要了解分布式锁。有了上面的经验之后,本以为对于死锁都能手到擒来,没想到再一个...

307

别让PEX和后仿真拖后腿:Calibre与Virtuoso ADE联调的那些‘坑’与最佳实践

本文深入探讨了Calibre与Virtuoso ADE在PEX寄生参数提取和后仿真联调中的常见问题与解决方案。针对DRC/LVS验证通过后出现的网表导入错误和仿真波形异常,提供了七大典型场景的实战经验,包括PEX提取模式选择、CalibreView生成细节、环境变量配置等关键环节的最佳实践,助力工程师高效完成芯片设计验证。

weixin_33695450的博客 393

【mysql并行批量删除死锁排查】

mysql 并行删除 死锁

weixin_43493520的博客 7478

新手小白 必须精进的 “ FLASH分区管理Code and Data ” !!!最强文章解析!!!

FLASH“代码区”和“数据区”不是每个项目都必须显式管理,但只要你的产品功能越来越丰富,对可靠性和扩展性要求提高,就一定要学会科学划分和使用。这也是嵌入式工程师进阶路上的必修课!

qq_75157958的博客 935

2023-ICCV-隐式神经网络实现低光照图像增强(NeRCo)论文解读+代码解析

NeRCo()提出了一种名为NeRCo的隐式神经表示方法,用于合作式低光图像增强。现有的低光图像增强方法存在以下三个限制:不可预测的亮度降低和噪声、度量友好版本和视觉友好版本之间的固有差距,以及有限的配对训练数据。为了解决这些限制,论文提出了NeRCo方法,它以无监督的方式稳健地恢复感知友好的结果。具体而言,NeRCo通过一个可控的拟合函数统一了现实场景中多样的退化因素,从而提高了鲁棒性。对于输出结果,论文引入了来自预训练视觉-语言模型的先验信息,采用语义导向的监督方法。

weixin_45595504的博客 3186

MySQL死锁了如何解决

咱们使用 MySQL 大概率上都会遇到死锁问题,这实在是个令人非常头痛的问题。本文将会对死锁进行相应介绍,对常见的死锁案例进行相关分析与探讨,以及如何去尽可能避免死锁给出一些建议。 –什么是死锁 死锁是并发系统中常见的问题,同样也会出现在数据库MySQL的并发读写请求场景中。当两个及以上的事务,双方都在等待对方释放已经持有的锁或因为加锁顺序不一致造成循环等待锁资源,就会出现“死锁”。常见的报错信息为 ” Deadlock found when trying to get lock… ”。 举例来说 A .

weixin_55932015的博客 683

YOLO 线性小目标涨点|3890 张输电导线散股 VOC+YOLO 单类别数据集实战,无人机电力缺陷巡检全流程落地

架空输电导线是电网能量传输核心载体,长期受风力摆动、雷击、腐蚀、外力撞击作用,外层铝股极易出现断裂散股故障。导线散股初期仅少量铝丝开裂,肉眼与无人机远距离航拍下属于细长微弱线性小目标;若未及时发现,散股会持续扩张,引发导线过热、断线、大面积停电重大电力安全事故。传统人工巡检存在多重行业痛点:山区、跨江河线路人员无法攀爬登杆,高空作业人身坠落风险极高;无人机单次航拍产出数千张高清图片,人工逐帧筛查微小散股耗时 3-5 天,阴天、逆光、植被遮挡场景漏检率超 45;

lin_xiu的博客 53

Mysql 操作死锁解决方案

Mysql 操作死锁:相关关键词 Waiting for table metadata lock ; trx_mysql_thread_id=0; XA事务

登: 1793

uniapp - [全端兼容] 实现精美Editor富文本编辑器功能,uniApp全平台兼容的富文本插件组件用户可上传图片及对接服务器存储文件等,手机移动端H5网页富文本/小程序富文本/App富文本!

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp富文本编辑器,uniapp中如何实现各平台都兼容的富文本编辑器,Editor富文本插件,uniApp微信小程序富文本,UNI-APP安卓苹果ios系统App端富文本组件,editor富文本编辑器如何实现上传图片,图片上传后不显示怎么办,如何配置图像上传功能,富文本图片上传怎么传到服务器中,获取图片路径,editor插入图片,富文本编辑器上传图片,报错怎么办,跨域CORS处理,配置不行无效

🏆 前端领域优质创作者 1万+

CH7034B显示模块原理图设计,已量产

显示桥接板的价值,不在于简单把 RGB 排线换成另一种接口,而在于能否把并行视频、时钟、显示控制、模拟输出和辅助配置同时组织成稳定系统。当前这张 CH7034B 原理图就是这种思路:U3 CH7034B 作为核心桥接芯片,输入侧是 LCD_R0~R7、LCD_G0~G7、LCD_B0~B7、LCD_DE、LCD_HSYNC、LCD_VSYNC、LCD_CLK 与 LCD_BL,输出侧则通过 DAC0~DAC2 和 DDC_SC/DDC_SD 形成模拟显示接口边界。

不脱发的程序猿 166

mysql holdlock_mysql 原理 ~ 死锁问题

一 锁1 锁的定义1 按照宏观角度共享锁【S锁】又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。排他锁【X锁】又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T...

weixin_28737073的博客 336

BVH2SMPL 实战笔记

BVH2SMPL 实战笔记

jacke121的专栏 843

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

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

noaman_wgs的博客 4万+

Statistics and Machine Learning Toolbox

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MySQL 死锁问题分析与解决方案

解决 MySQL 死锁需结合。

weixin_45226922的博客 1844

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MySQL死锁分析及解决的方法

MySQL死锁分析及解决的方法   MySQL死锁问题的相关知识。   1、MySQL常用存储引擎的锁机制   MyISAM和MEMORY采用表级锁(table-level locking)   BDB采用页面锁(page-level locking)或表级锁,默认为页面锁   InnoDB支持行级锁(row-level locking)和表级锁,默认

li_dongliang的专栏 1430

VB摄像头监控

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

MySQL死锁问题如何分析&锁表后查看死锁和去除死锁快速解决方法

(1) 遇到锁表快速解决办法   依次执行1-6步,运行第6步生成的语句即可。   如果特别着急,运行 1 2 6 步 以及第6步生成的kill语句 即可。 1. 第1步 查看表是否在使用。 show open tables where in_use > 0 ; 如果查询结果为空。则证明表没有在使用。结束。 mysql> show open tables where in_use > 0 ; Empty set (0.00 sec) 如果查..

赵英超的博客 2万+

mysql死锁报错循环_MySQL死锁分析与解决之路

来自:贝壳DBA咱们使用 MySQL 大概率上都会遇到死锁问题,这实在是个令人非常头痛的问题。本文将会对死锁进行相应介绍,对常见的死锁案例进行相关分析与探讨,以及如何去尽可能避免死锁给出一些建议。--什么是死锁 --死锁是并发系统中常见的问题,同样也会出现在数据库MySQL的并发读写请求场景中。当两个及以上的事务,双方都在等待对方释放已经持有的锁或因为加锁顺序不一致造成循环等待锁资源,就会出现“死...

weixin_39683025的博客 202

一个MySQL死锁问题的分析及解决

最近在做YMUwebsite monitoring项目开发过程,碰到了数据库的死锁问题,在解决问题的过程中,加深了对MySQL InnoDB引擎锁机制的理解。我们使用Show innodb status检查引擎状态时,发现了死锁问题:*** (1) TRANSACTION:TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OS thr

java_veteran的专栏 1223

MySQL模拟死锁以及分析和解决方案

mysql死锁模拟案例、死锁的发生条件、怎么避免死锁、查看死锁日志以及解决方案

泡^泡 5313

MySQL 事务死锁排查:从日志分析到解决实战

比如电商平台的并发下单场景,若两个订单同时操作同两个商品的库存,就可能出现 “事务 A 锁商品 1 等商品 2,事务 B 锁商品 2 等商品 1” 的死锁。此时两个事务进入无限等待,MySQL 会检测到死锁并终止其中一个事务(“牺牲者”),释放其持有的锁,让另一个事务继续执行。以上述商品库存为例,无论业务顺序如何,强制两个事务都先更新 id 小的商品,再更新 id 大的商品:​。死锁排查的核心是 “通过日志找到锁竞争关系”,解决的关键是 “破坏死锁的必要条件”。长事务会持有锁更久,增加死锁概率。

qq_37782946的博客 1213

mysql死锁异常分析及解决

前言 其实在这次之前也发生过死锁异常,但当时并没当回事,也没分析数据,简单的认为是偶发现象,并且是修改同一用户产生,于是就在最初添加了select for update,直到这两天发生了好几笔,分析数据发现并不是之前猜测的那样 问题产生 这两天老接到运维通知,说某客户又发生了卡单现象,让我分析下问题,然后找来日志,异常信息如下: ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollback

qq_37910618的博客 6574

数据库面试必备:MySQL死锁问题分析与解决方案

死锁(Deadlock)是指两个或多个事务在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法继续执行下去。

qq_58299462的博客 1389

MySQL死锁问题实例分析及解决方法

MySQL死锁问题的相关知识是本文我们主要要介绍的内容,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。  1、MySQL常用存储引擎的锁机制  MyISAM和MEMORY采用表级锁(table-level locking)  BDB采用页面锁(page-level locking)或表级锁,默认为页面锁  InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

虚怀若谷 1865
上一篇: 为什么你写的拦截器中不能注入Java bean?
下一篇: gRPC框架学习:5、Java+gRPC+maven+idea实例测试并打jar包
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值