中秋遇到mysql死锁怎么办

本文详细介绍了MySQL中死锁的概念、产生条件、示例、分析与查看方法,包括死锁探测机制、锁等待超时机制,以及手动释放锁的操作。此外,还探讨了死锁的优化策略,如调整事务处理和避免锁竞争,帮助开发者更好地应对中秋等假期期间可能出现的数据库死锁问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录


前言

中秋放假期间,线上mysql数据库突然提示出现死锁异常怎么办?是不是内心突然慌的一批,假期再也不能愉快的玩耍了。
莫慌莫慌,今天老万教你遇到了mysql死锁应该怎么办。


一、什么是死锁

所谓死锁:是指多个事务在并发执行过程中由于相互持有对方需要的锁,都在等待资源变的可用而不会主动释放自身持有的锁,从而导致循环等待的情况。

通常表级锁不会产生死锁,所以解决死锁主要还是针对于最常用的InnoDB。

官方文档:
Innodb死锁:https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks.html

二、死锁的产生条件

发生死锁的必要条件有4个, 分别为互斥条件、不可剥夺条件、请求与保持条件和循环等待条件
在这里插入图片描述
从这几点来看,mysql中的死锁产生条件和java程序中死锁产生条件是一致的。

但是java程序中的死锁往往会产生更严重的后果,而mysql中的死锁由于数据库内部的死锁处理机制,一般不会产生很严重的影响。

三、死锁示例

表和数据准备:

DROP TABLE if EXISTS user;

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `account` varchar(30) DEFAULT NULL COMMENT '账号',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_account` (`account`),
  KEY `ik_name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

-- 英文名,主要是更容易验证间隙锁
INSERT INTO `user` (`id`,`account`,`name`, `age`, `email`) VALUES (3, '000003','Andi', 12, '10003@qq.com');
INSERT INTO `user` (`id`, `account`,`name`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值