Mysql死锁解决办法
使用navicat客户端工具连接上测试的mysql数据库,新建一个测试表
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`login_name` varchar(50) NOT NULL COMMENT '用户名',
`pwd` varchar(50) NOT NULL COMMENT '密码',
`nick_name` varchar(90) DEFAULT NULL COMMENT '用户昵称',
`usable` int(11) NOT NULL DEFAULT '1' COMMENT '是否可用 0:不可用;1:可用',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`last_login_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后登录时间',
PRIMARY KEY (`id`),
UNIQUE KEY `login_name` (`login_name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户表';
数据如图所示:
打开一个新的会话窗口,执行以下语句
set autocommit=0; --关闭自动提交
SELECT * from t_user t where t.id='1' FOR UPDATE; 给id为1的数据行添加行锁
打开另一个新的会话窗口,执行以下语句
set autocommit=0; --关闭自动提交
SELECT * from t_user t where t.id='2' FOR UPDATE; 给id为2的数据行添加行锁
这个时候,2和3步骤各持了一把锁。下面开始在会话一执行
SELECT * from t_user t where t.id='2' FOR UPDATE;
会出现锁等待的情况
在会话二里执行
SELECT * from t_user t where t.id='1' FOR UPDATE;
则出现了死锁提示:
ERROR 1213 : Deadlock found when trying to get lock; try restarting transaction
mysql自动检测到了两个会话互相等待锁的情况,则把最后一个会话做了回滚操作
可以通过以下三个语句来查询被打开的表,正在执行的任务列表和开启的事务
show OPEN TABLES where In_use > 0;
show processlist; -- kill杀死进程id(id列)
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
-- kill杀死进程id(trx_mysql_thread_id列)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
2020-08-17 zookeeper原理之Leader选举源码分析