关于MYSQL 死锁的问题 Deadlock found when trying to get lock; try restarting ..........

xiaoping117 xiaoping117 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
定时执行的MYSQL 存储过程报错:
Deadlock found when trying to get lock; try restarting transaction

这个错误是在MYSQL 的错误日志中看到的, 不知道要从哪里开始入手解决这个问题。 暂时没发现这个错误对业务逻辑有什么影响,求高手指点。 贴出过程代码如下:




DELIMITER $$

USE `sms`$$

DROP PROCEDURE IF EXISTS `proc_passout`$$

CREATE DEFINER=`root`@`%` PROCEDURE `proc_passout`()
BEGIN
DECLARE flag_lt INT(4);
DECLARE flag_dx INT(4);
DECLARE flag_yd INT(4);
DECLARE flag INT(4) DEFAULT 0;
DECLARE allflag INT(4);
DECLARE cont_flag INT(4);
DECLARE cont_deliverflag INT;
DECLARE i_oid VARCHAR(20) DEFAULT 0;
DECLARE tmpName VARCHAR(20) DEFAULT '' ;
DECLARE selectmoid CURSOR FOR
SELECT oid FROM cont WHERE DELIVERFLAG=5 ORDER BY oid ASC LIMIT 100;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpName = NULL;
/*=========================*/
SET cont_deliverflag=9;
OPEN selectmoid;
FETCH selectmoid INTO i_oid;
/*处理黑名单*/
SET autocommit=0;
UPDATE mt a,blacklist b SET a.deliverflag=1,a.delivertime=LEFT(NOW()+0,14),a.msgid='blacklist'
WHERE a.phone=b.phone AND a.moid=i_oid;
COMMIT;
/*=========================*/
WHILE ( tmpName IS NOT NULL) DO
/*===========联通========*/
SELECT COUNT(*) INTO flag_lt FROM mt WHERE moid=i_oid
AND SUBSTR(phone,1,3) IN(SELECT subphone FROM telcom WHERE TYPE IN(2));
/*==========电信==========*/
SELECT COUNT(*) INTO flag_dx FROM mt WHERE moid=i_oid
AND SUBSTR(phone,1,3) IN(SELECT subphone FROM telcom WHERE TYPE IN(3));
/*============总数=========*/
SELECT COUNT(*) INTO allflag FROM mt WHERE moid=i_oid;
IF flag_lt=allflag THEN #全是联通号
UPDATE cont SET channelid=1,deliverflag=cont_deliverflag WHERE oid=i_oid;
SET flag =1;
ELSEIF flag_dx=allflag THEN #全是电信号
UPDATE cont SET channelid=10,deliverflag=cont_deliverflag WHERE oid=i_oid ;
SET flag=1;
ELSE
/*处理联通号码*/
IF flag_lt>0 AND flag=0 THEN
SET @moid=seq('cont');
SET autocommit=0;
UPDATE mt SET moid=@moid WHERE moid=i_oid
AND SUBSTR(phone,1,3)
IN(SELECT subphone FROM telcom WHERE TYPE IN(2));
INSERT INTO cont(putintime,Oid, MsgType, MsgCont, ChannelId, ChName, ChPassword, SpNumber,DeliverFlag,PRIORITY)
SELECT PUTINTIME,@moid,MSGTYPE,MSGCONT,1,CHNAME,CHPASSWORD,SPNUMBER,cont_deliverflag,PRIORITY
FROM cont WHERE oid=i_oid AND DELIVERFLAG=5;
COMMIT;
END IF;
/*处理CDMA号码*/
IF flag_dx>0 AND flag=0 THEN
SET @moid=seq('cont');
SET autocommit=0;
UPDATE mt SET moid=@moid WHERE moid=i_oid
AND SUBSTR(phone,1,3)
IN(SELECT subphone FROM telcom WHERE TYPE IN(3));
INSERT INTO cont(putintime,Oid, MsgType, MsgCont, ChannelId, ChName, ChPassword, SpNumber,DeliverFlag,PRIORITY)
SELECT PUTINTIME,@moid,MSGTYPE,MSGCONT,10,CHNAME,CHPASSWORD,SPNUMBER,cont_deliverflag,PRIORITY
FROM cont WHERE oid=i_oid AND DELIVERFLAG=5;
COMMIT;
END IF;
END IF;
SELECT COUNT(*) INTO flag_yd FROM mt WHERE moid=i_oid
AND SUBSTR(phone,1,3) IN(SELECT subphone FROM telcom WHERE TYPE IN(2,3));
/*处理移动号码*/
IF flag_yd=0 THEN
SET autocommit=0;
UPDATE cont SET DELIVERFLAG=cont_deliverflag WHERE cont.OID=i_oid AND DELIVERFLAG=5;
COMMIT;
END IF;
FETCH selectmoid INTO i_oid;
END WHILE;
CLOSE selectmoid;

END$$

DELIMITER ;



...全文

相关推荐

mysql报错:Deadlock found when trying to get lock; try restarting transaction的解决方法

主要给大家介绍了关于mysql出现报错:Deadlock found when trying to get lock; try restarting transaction的解决方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

weixin_38595528

查看数据库死锁信息

服务器运行一天后,就开始频繁报错:Deadlock found when trying to get to lock; try restarting transaction. 死锁的头号原因是外键未加索引,第二号原因是位图索引遭到并发更改;

qq_36232967

InnoDB数据库死锁问题处理

场景描述 在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction…)。 问题分析 这个异常并不会影响用户使用,因为数据库遇到死锁会自动回滚并重试。用户的感觉就是操作稍有卡顿。但是监控老是报异常,所以需要解决一下。 解决方法 在应用程序中update的地方使用try-catch。 我自己封装了一个函数,如下。 /** * 2016-03-15 * linxuan * handle deadlock wh

weixin_38535132

MYSQL 数据库死锁

博文链接:https://gghaomm.iteye.com/blog/2123485

weixin_38669628

一不小心,间隙锁引发的报警现场

摘要 今天来分享一下我在线上环境遇到的有关MySQL间隙锁的死锁问题。本文将讲述从发现问题到解决问题的全过程,并给出一些个人建议,其中使用的数据将做脱敏处理,但不影响食用口感。 发现问题 运维同学发现有大量的MySQL死锁日志输出,如果你的系统有对MySQL进行死锁监控,可会在图形界面上很直观的发现这个问题。 你会发现日志里有大量下面这样的log输出: Deadlock found when trying to get lock; try restarting transaction 定位问题 既然知道了是死锁造成的问题,那怎么定位问题呢?我们可以使用show engine innodb s

weixin_38698174
评论 16
收藏 已收藏
分享
返回顶部
xiaoping117
MySQL 57,062 成员 56,759 内容