ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mysql死锁解决办法

2022-08-17 00:31:46  阅读:248  来源: 互联网

标签:COMMENT 解决办法 UPDATE 死锁 Mysql NULL where id SELECT


使用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列)

 

 

 

 

 

标签:COMMENT,解决办法,UPDATE,死锁,Mysql,NULL,where,id,SELECT
来源: https://www.cnblogs.com/47Gamer/p/16593493.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有