![从一个例子入门Mysql储存过程](http://img.jiangsulong.com/220404/1T24R148-0.jpg)
文章插图
【从一个例子入门Mysql储存过程】
例子
-- 秒杀执行存储过程DELIMITER $$ -- 将分隔符; 转换为 $$-- 定义存储过程-- 参数: in 输入参数; out 输出参数-- row_count():返回上一条修改类型sql(delete,insert,update)的影响行数-- row_count: 0:未修改数据; >0:表示修改的行数; <0:sql错误/未执行修改sqlCREATE PROCEDURE `seckill`.`execute_seckill` (in v_seckill_id bigint,in v_phone bigint, in v_kill_time timestamp,out r_result int)--创建储存过程 BEGIN-- 开始执行 DECLARE insert_count int DEFAULT 0;-- 定义变量 START TRANSACTION;--开启事物管理 insert ignore into success_killed (seckill_id,user_phone,create_time) values (v_seckill_id,v_phone,v_kill_time);--执行insert语句 select row_count() into insert_count;--返回影响行数 IF (insert_count = 0) THEN ROLLBACK;--事务回滚 set r_result = -1;--返回未修改数据 ELSEIF(insert_count < 0) THEN ROLLBACK;--事务回滚 set R_RESULT = -2;--返回未知错误 ELSE update seckill set number = number-1 where seckill_id = v_seckill_id and end_time > v_kill_time and start_time < v_kill_time and number > 0;--执行update语句 select row_count() into insert_count;--返回影响行数 IF (insert_count = 0) THEN ROLLBACK;--事务回滚 set r_result = 0;--返回未修改数据 ELSEIF (insert_count < 0) THEN ROLLBACK;--事务回滚 set r_result = -2;--返回未知错误 ELSE COMMIT;--提交,事务结束 set r_result = 1;--返回执行成功 END IF;--结束IF语句 END IF;--结束IF语句 END;--结束储存过程$$--结束sql-- 存储过程定义结束DELIMITER ;--还原分隔符为;--set @r_result=-3;--定义用户变量-- 执行存储过程call execute_seckill(1003,13502178891,now(),@r_result);-- 获取结果select @r_result;-- 存储过程-- 1:存储过程优化:事务行级锁持有的时间-- 2:不要过度依赖存储过程-- 3:简单的逻辑可以应用存储过程-- 4:QPS:一个秒杀单6000/qps1.储存过程参数
- IN:参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
- OUT:该值可在存储过程内部被改变,并可返回
- INOUT:调用时指定,并且可被改变和返回
推荐阅读
- 见了嘉庆皇帝 嘉庆皇帝下一个皇帝是谁
- 梦见老公突然有个儿子 梦见老公又有一个媳妇,而且还有一个女儿
- 屋面防水施工方案
- 梦见自己从山顶滑落下来 梦见从山顶上慢慢的滑下来
- 梦见自己手掌裂开个大口子会怎样 梦到手裂开一个大口子
- 我国近代第一个由中国人组成的西式管弦乐队是 19世纪中叶在上海英租界的外国侨民最先创办的乐队是
- 吐鲁番葡萄沟
- 从茶叶贩卖黑历史看造假后果
- 汉朝刘弗陵后一个皇帝是谁 汉昭帝刘弗陵死后,谁继位?
- 高端茶叶茗品降温