文章目录
前言
中秋放假期间,线上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`