如下是 mysql 的错误信息:

Deadlock found when trying to get lock; try restarting transaction

以下是相关的两个mysql存储过程代码:

1:

REATE DEFINER=`ab`@`%` PROCEDURE `pay_created_orders`(IN `_id` VARCHAR(32), IN `_goods_id` VARCHAR(32), IN `_uid` BIGINT(20), IN `_platform` VARCHAR(10), IN `_money` FLOAT, IN `_discount_id` BIGINT(20), IN `_target_uid` BIGINT(20), IN `_live_id` BIGINT(10), IN `_count` INT(10))

MODIFIES SQL DATA

SQL SECURITY INVOKER

BEGIN

DECLARE id BIGINT DEFAULT 0;

DECLARE t_err SMALLINT DEFAULT 0;

DECLARE goods_count INT DEFAULT 0;

DECLARE var_goods_type SMALLINT DEFAULT 0;

DECLARE var_top_card_sums INT DEFAULT 0;

DECLARE var_count SMALLINT DEFAULT 0;

DECLARE var_date VARCHAR(10) DEFAULT '';

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_err=-1;

START TRANSACTION;

SET var_goods_type = (SELECT `ops` FROM `goods` WHERE `goods_id`=`_goods_id` LIMIT 1);

SET var_date = FROM_UNIXTIME(UNIX_TIMESTAMP(CURDATE()), '%Y%m%d');

IF var_goods_type = 1 THEN

SET var_top_card_sums = (SELECT topcard_sum AS var_top_card_sums FROM users_topcard WHERE `uid`=`_target_uid` AND `date`= var_date FOR UPDATE);

IF var_top_card_sums >= 10 THEN

SET t_err = -1;

SET id = -3;

END IF;

END IF;

SET var_count = (SELECT COUNT(`uid`) AS var_count FROM `users_ios_sandbox` WHERE `uid`=`_uid`);

IF var_count > 0 THEN

SET `_platform` = 'iossandbox';

END IF;

SET goods_count = (SELECT `count` FROM goods WHERE `goods_id`=`_goods_id` LIMIT 1 FOR UPDATE);

INSERT INTO `users_orders`(

`id`, `uid`, `goods_id`, `platform`, `beans`, `discount_id`,

`pay_time`, `datetime`, `status`, `target_uid`, `live_id`,

`count`

) VALUES (

`_id`, `_uid`, `_goods_id`, `_platform`, `_money`, `_discount_id`,

0, UNIX_TIMESTAMP(), 0, `_target_uid`, `_live_id`,

`_count`

);

IF goods_count > 0 THEN

UPDATE `goods` SET

`count`=`count`-1

WHERE `goods_id`=`_goods_id`;

END IF;

IF goods_count = 0 OR goods_count < -1 THEN

SET id=-2;

SET t_err = -1;

END IF;

IF t_err = -1 THEN

ROLLBACK;

ELSE

COMMIT;

END IF;

SELECT `id` AS `id`;

END;

2:

CREATE DEFINER=`ab`@`%` PROCEDURE `pay_modified_orders`(

IN `_id` VARCHAR(32),

IN `_status` INT(10),

IN `_consumes_id` VARCHAR(32) CHARSET UTF8

)

MODIFIES SQL DATA

SQL SECURITY INVOKER

BEGIN

DECLARE gid BIGINT DEFAULT 0;

DECLARE g_count INT DEFAULT 0;

DECLARE t_err SMALLINT DEFAULT 0;

DECLARE var_goods_id INT DEFAULT 0;

DECLARE var_goods_beans DOUBLE DEFAULT 0;

DECLARE var_goods_ratio DOUBLE DEFAULT 100;

DECLARE var_after_beans DOUBLE DEFAULT 0;

DECLARE var_uid BIGINT DEFAULT 0;

DECLARE var_target_uid BIGINT DEFAULT 0;

DECLARE var_live_id INT DEFAULT 0;

DECLARE var_goods_count INT DEFAULT 0;

DECLARE var_expenses_id BIGINT DEFAULT 0;

DECLARE var_top_card_sums SMALLINT DEFAULT 0;

DECLARE var_date VARCHAR(10) DEFAULT '';

DECLARE var_goods_type SMALLINT DEFAULT 0;

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_err=-1;

START TRANSACTION;

SELECT COUNT(id) AS g_count,goods_id,beans,uid,target_uid,live_id,count INTO g_count, var_goods_id, var_goods_beans, var_uid, var_target_uid, var_live_id, var_goods_count

FROM `users_orders`

WHERE `id`=`_id` LIMIT 1 FOR UPDATE;

#SET g_count=(SELECT count(*) FROM `users_orders` WHERE `id`=`_id` LIMIT 1 FOR UPDATE);

IF g_count <> 1 THEN

SET t_err=-1;

END IF;

SET var_date = FROM_UNIXTIME(UNIX_TIMESTAMP(CURDATE()), '%Y%m%d');

SET var_goods_type = (SELECT `ops` FROM `goods` WHERE `goods_id`=`var_goods_id` LIMIT 1);

IF `_status` = 1 THEN

SET var_expenses_id = (SELECT expenses_id FROM users_expenses WHERE order_id=`_id` LIMIT 1);

IF var_expenses_id <= 1 OR ISNULL(var_expenses_id) THEN

SET var_goods_ratio = (SELECT ratio FROM `goods_ratio` WHERE `goods_id`=`var_goods_id` AND `start_time` <= UNIX_TIMESTAMP() AND `end_time` >= UNIX_TIMESTAMP() LIMIT 1);

IF ISNULL(var_goods_ratio) OR var_goods_ratio<=0 THEN

SET var_goods_ratio = 100;

END IF;

SET var_after_beans = var_goods_beans * (var_goods_ratio / 100);

INSERT INTO `users_expenses`(

`uid`, `target_uid`, `live_id`, `order_id`, `consume_id`,

`goods_id`, `beans`, `after_beans`, `goods_count`,

`timestamp`, `type`, `extra`) VALUE (

`var_uid`, `var_target_uid`, `var_live_id`, `_id`, `_consumes_id`,

`var_goods_id`, `var_goods_beans`, `var_after_beans`, `var_goods_count`,

UNIX_TIMESTAMP(), 1, ''

);

IF var_goods_type = 1 THEN

SET var_top_card_sums = (SELECT topcard_sum AS var_top_card_sums FROM users_topcard WHERE `uid`=`var_target_uid` AND `date`= var_date FOR UPDATE);

IF var_top_card_sums >= 10 THEN

SET t_err = -1;

END IF;

IF var_top_card_sums = 0 OR ISNULL(var_top_card_sums) THEN

INSERT INTO users_topcard (

`uid`, `date`, `topcard_sum`, `last_time`)

VALUES (

`var_target_uid`, var_date, 1, UNIX_TIMESTAMP());

ELSEIF var_top_card_sums > 0 AND var_top_card_sums <10 THEN

UPDATE users_topcard SET topcard_sum=topcard_sum+1,last_time=UNIX_TIMESTAMP() WHERE uid=`var_target_uid` AND `date`=var_date;

END IF;

END IF;

END IF;

END IF;

UPDATE `users_orders` SET

`pay_time`=UNIX_TIMESTAMP(),

`status`=`_status`,

`consumes_id`=`_consumes_id`

WHERE `id`=`_id`;

IF t_err = -1 THEN

ROLLBACK;

SET gid = -1;

ELSE

COMMIT;

SET gid = `_id`;

END IF;

SELECT `gid` AS `id`;

END;

mysql 存储过程 行锁_mysql存储过程出现锁表锁行的情况怎么解决?如:相关推荐

  1. mysql 存储过程 定义数组_MySql存储过程

    Mysql进阶 存储过程 1 什么是存储过程 1.存储过程,带有逻辑的sql语句 2.之前的sql没有条件判断,没有循环 3.存储过程带上流程控制语句(if while) 2 存储过程特点 1)执行效 ...

  2. mysql存储过程中文乱码_mysql存储过程中文乱码

    MySQL 中存储过程 中文乱码问号??? mysql 中文乱码一直是一个老大难的问题,接下来一一解决!!!! 数据库存储数据乱码 存储过程中数据乱码 001 数据库存储数据乱码 相信大家遇到最多就是 ...

  3. mysql游标 原理解说_mysql存储过程之游标(DECLARE)原理与用法详解

    本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法.分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每 ...

  4. MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

    MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁 ...

  5. mysql 存储过程 out 用处_mysql存储过程 OUT or INOUT argument 3 for routine

    mysql存储过程出现: OUT or INOUT argument 3 for routine gotask.UserLogin is not a variable or NEW pseudo-va ...

  6. mysql 存储过程加密工具_MySQL存储过程调试工具-dbForge Studio for MySQL

    对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那么如果能找到一个比较好的调试工具,就可以事半功倍, 这里介绍的是dbForge Studio for ...

  7. mysql myisam表_mysql优化之MyISAM表锁

    概述 MyISAM存储引擎只支持表锁,mysql的表锁有两种模式:读锁和写锁. 他们的兼容关系是(对myisam的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作*)和(对myisa ...

  8. mysql设置乐观锁_mysql数据库怎么设置乐观锁

    乐观锁与悲观锁不同的是,它是一种逻辑上的锁,而不需要数据库提供锁机制来支持当数据很重要, 回滚或重试一次需要很大的开销时,需要保证操作的ACID性质, 此时应该采用悲观锁而当数据对即时的一致性要求不高 ...

  9. mysql存储过程注释方法_mysql存储过程 详细注释

    原文:https://my.oschina.net/u/3582142/blog/1581929 delimiter $$ /* 重新定义mysql结束符,而不再是分号是结束符 */ create p ...

  10. mysql的存储过程放在哪里_mysql存储过程,这个错在哪里?

    mysql存储过程,这个错在哪里? 关注:294  答案:2  mip版 解决时间 2021-01-28 01:15 提问者人潮拥挤你不在 2021-01-27 19:57 begin declare ...

最新文章

  1. 基于用户投票的排名算法(三):Stack Overflow
  2. axios 发送 AJAX请求
  3. python随机发牌_魔术师发牌问题 -- python实现
  4. 【企业管理】14 项管理原则
  5. Maven学习笔记(二)
  6. The 2018 ACM-ICPC Chinese Collegiate Programming Contest B. Rolling The Polygon
  7. 阿里天池供应链需求预测比赛小结
  8. NOIP模拟测试25
  9. 理解和使用 JavaScript 中的回调函数
  10. Ubuntu18.04安装HP laser 1020打印机
  11. 注意力机制论文:CCNet: Criss-Cross Attention for Semantic Segmentation及其PyTorch实现
  12. springboot基于微信小程序的宿舍管理系统毕业设计源码
  13. java short =_java short类型取值范围与用法
  14. golang 实现HTTP代理和反向代理
  15. OSPF 之 6类LSA详解
  16. Kubernetes Events介绍(下)
  17. Xshell7工具下载安装以及简单使用
  18. ubuntu下命令行输入 sudo: ./xxx.sh:找不到命令
  19. “倔驴”一个h5小游戏的实现和思考(码易直播)——总结与整理
  20. js 操作字符串的API

热门文章

  1. Python可以这样学(第六季:SQLite数据库编程)-董付国-专题视频课程
  2. python selenium 点击加载更多_如何等待页面加载,然后按selenium中的“加载更多”按钮?...
  3. c语言lr分析器的设计与实现_[源码和文档分享]基于有限自动机的词法分析器构造...
  4. java transient关键字_嗯?你真的会用 Java 序列化机制?
  5. 力扣429. N 叉树的层序遍历(JavaScript)
  6. android网络请求分析工具,android网络数据请求
  7. 单片机单口不可用或被占用_昆明工业控制单片机应用开发价格
  8. 文本分类模型_【文本分类】几个可作为Baseline的模型
  9. java wait api_java API 文档
  10. Altium Designer实现原理图到PCB板的转换