Innodb 死锁案例解析

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云解析 DNS,旗舰版 1个月
简介:

先贴上案例信息吧:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*** (1) TRANSACTION:
TRANSACTION 52EDC5761, ACTIVE 0 sec inserting
mysql tables  in  use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1248, 2 row lock(s)
MySQL thread  id  34815573, OS thread handle 0x7f1e42a6a700, query  id  9442822687 192.168.1.216 pns update
INSERT IGNORE INTO user_device_app (uid,aid) VALUES(22504356,219843041)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space  id  527 page no 7603 n bits 584 index `PRIMARY` of table `pns`.`user_device_app` trx  id  52EDC5761 lock_mode X lock
s rec but not gap waiting
*** (2) TRANSACTION:
TRANSACTION 52EDC5762, ACTIVE 0 sec inserting
mysql tables  in  use 1, locked 1
3 lock struct(s), heap size 1248, 2 row lock(s)
MySQL thread  id  34823701, OS thread handle 0x7f1e58309700, query  id  9442822688 192.168.1.86 pns update
INSERT IGNORE INTO user_device_app (uid,aid) VALUES(22504356,219843041)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space  id  527 page no 7603 n bits 584 index `PRIMARY` of table `pns`.`user_device_app` trx  id  52EDC5762 lock mode S lock
s rec but not gap
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space  id  527 page no 7603 n bits 584 index `PRIMARY` of table `pns`.`user_device_app` trx  id  52EDC5762 lock_mode X lock
s rec but not gap waiting
*** WE ROLL BACK TRANSACTION (2)

解释说明下: uid,aid 做为主键,且程序中未开启事务;对于user_device_app 表也只有 delete... ; insert ignore ...., select 三个操作;

死锁是由两个完全相同的语句: insert ignore into user_device_app 造成的;

个人在测试环境,怎么也不能重现死锁的现象

后经请教: insert ignore 是先获得S锁(共享锁),然后在升级为X锁;(所以死锁信息中事务2在后的S锁后,又开始获得X锁)

由于两个事务同时获得了S锁,都升级为X锁的时候,都在互相等待,所以出现死锁现象;

小结:

数据库端:若要避免使用ignore 这样的关键字陷入死锁中:

要禁止同一行并行执行INSERT…ON DUPLICATE KEY特别是INSERT…ON DUPLICATE KEY UPDATE ,以及INSERT IGNORE语句。实在不行就改为(select + insert 来处理)

程序端

要有捕捉死锁回滚信息的代码;

对于防止用户点击多次,造成重复记录的,可以在前端代码中做出限制






本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1309953,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
数据采集 人工智能 安全
数据治理的实践与挑战:大型案例解析
在当今数字化时代,数据已成为企业运营和决策的核心资源。然而,随着数据量的爆炸性增长和数据来源的多样化,数据治理成为了企业面临的重要挑战之一。本文将通过几个大型案例,探讨数据治理的实践、成效以及面临的挑战。
数据治理的实践与挑战:大型案例解析
|
20天前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
|
29天前
|
Prometheus 监控 Cloud Native
实战经验:成功的DevOps实施案例解析
实战经验:成功的DevOps实施案例解析
42 6
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
2月前
|
数据格式
常用的Lambda表达式案例解析,工作中都会用到!
常用的Lambda表达式案例解析,工作中都会用到!
|
2月前
|
存储 数据采集 监控
CDGA\如何建立实现数据治理的效率价值框架:实践案例解析
数据治理是一个持续优化的过程。组织应建立健全的监督与评估机制,定期对数据治理工作进行评估,发现问题及时整改。广东药科大学通过数据全景图和数据监控大屏,实现了对数据治理成果的动态、多维度呈现与监控,为科学管理决策提供了有力支撑。
|
2月前
|
存储 缓存 关系型数据库
详细解析MySQL中的innodb和myisam
总之,InnoDB和MyISAM各有千秋,选择合适的存储引擎应基于对应用程序特性的深入理解,以及对性能、数据完整性和可扩展性的综合考量。随着技术发展,InnoDB因其全面的功能和日益优化的性能,逐渐成为更广泛场景下的首选。然而,在特定条件下,MyISAM依然保留其独特的价值。
129 0
|
17天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
125 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
17天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
17天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的段、区和页
MySQL的InnoDB存储引擎逻辑存储结构与Oracle相似,包括表空间、段、区和页。表空间由段和页组成,段包括数据段、索引段等。区是1MB的连续空间,页是16KB的最小物理存储单位。InnoDB是面向行的存储引擎,每个页最多可存放7992行记录。

推荐镜像

更多
下一篇
无影云桌面