mysql 存储过程 行锁_mysql存储过程出现锁表锁行的情况怎么解决?如:
如下是 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存储过程出现锁表锁行的情况怎么解决?如:相关推荐
- mysql 存储过程 定义数组_MySql存储过程
Mysql进阶 存储过程 1 什么是存储过程 1.存储过程,带有逻辑的sql语句 2.之前的sql没有条件判断,没有循环 3.存储过程带上流程控制语句(if while) 2 存储过程特点 1)执行效 ...
- mysql存储过程中文乱码_mysql存储过程中文乱码
MySQL 中存储过程 中文乱码问号??? mysql 中文乱码一直是一个老大难的问题,接下来一一解决!!!! 数据库存储数据乱码 存储过程中数据乱码 001 数据库存储数据乱码 相信大家遇到最多就是 ...
- mysql游标 原理解说_mysql存储过程之游标(DECLARE)原理与用法详解
本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法.分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每 ...
- MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解
MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁 ...
- 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 ...
- mysql 存储过程加密工具_MySQL存储过程调试工具-dbForge Studio for MySQL
对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那么如果能找到一个比较好的调试工具,就可以事半功倍, 这里介绍的是dbForge Studio for ...
- mysql myisam表_mysql优化之MyISAM表锁
概述 MyISAM存储引擎只支持表锁,mysql的表锁有两种模式:读锁和写锁. 他们的兼容关系是(对myisam的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作*)和(对myisa ...
- mysql设置乐观锁_mysql数据库怎么设置乐观锁
乐观锁与悲观锁不同的是,它是一种逻辑上的锁,而不需要数据库提供锁机制来支持当数据很重要, 回滚或重试一次需要很大的开销时,需要保证操作的ACID性质, 此时应该采用悲观锁而当数据对即时的一致性要求不高 ...
- mysql存储过程注释方法_mysql存储过程 详细注释
原文:https://my.oschina.net/u/3582142/blog/1581929 delimiter $$ /* 重新定义mysql结束符,而不再是分号是结束符 */ create p ...
- mysql的存储过程放在哪里_mysql存储过程,这个错在哪里?
mysql存储过程,这个错在哪里? 关注:294 答案:2 mip版 解决时间 2021-01-28 01:15 提问者人潮拥挤你不在 2021-01-27 19:57 begin declare ...
最新文章
- 基于用户投票的排名算法(三):Stack Overflow
- axios 发送 AJAX请求
- python随机发牌_魔术师发牌问题 -- python实现
- 【企业管理】14 项管理原则
- Maven学习笔记(二)
- The 2018 ACM-ICPC Chinese Collegiate Programming Contest B. Rolling The Polygon
- 阿里天池供应链需求预测比赛小结
- NOIP模拟测试25
- 理解和使用 JavaScript 中的回调函数
- Ubuntu18.04安装HP laser 1020打印机
- 注意力机制论文:CCNet: Criss-Cross Attention for Semantic Segmentation及其PyTorch实现
- springboot基于微信小程序的宿舍管理系统毕业设计源码
- java short =_java short类型取值范围与用法
- golang 实现HTTP代理和反向代理
- OSPF 之 6类LSA详解
- Kubernetes Events介绍(下)
- Xshell7工具下载安装以及简单使用
- ubuntu下命令行输入 sudo: ./xxx.sh:找不到命令
- “倔驴”一个h5小游戏的实现和思考(码易直播)——总结与整理
- js 操作字符串的API
热门文章
- Python可以这样学(第六季:SQLite数据库编程)-董付国-专题视频课程
- python selenium 点击加载更多_如何等待页面加载,然后按selenium中的“加载更多”按钮?...
- c语言lr分析器的设计与实现_[源码和文档分享]基于有限自动机的词法分析器构造...
- java transient关键字_嗯?你真的会用 Java 序列化机制?
- 力扣429. N 叉树的层序遍历(JavaScript)
- android网络请求分析工具,android网络数据请求
- 单片机单口不可用或被占用_昆明工业控制单片机应用开发价格
- 文本分类模型_【文本分类】几个可作为Baseline的模型
- java wait api_java API 文档
- Altium Designer实现原理图到PCB板的转换