自己的乙個小小的新的,寫給大家。
-- 判斷是否有改儲存過程,有就刪除。
drop procedure if exists seckill.execute_seckill;
-- 執行秒殺的儲存過程
delimiter $$ -- ;結尾改為$$
-- 定義儲存過程
-- 引數:in輸入引數,out輸出引數
-- insert_count返回上一條修改型別sql的影響行數(delete,insert,update)
-- row_count() : 0;標示未修改資料,>0:標示修改的行數,<0 標示sql錯誤/執行修改
create procedure seckill.execute_seckill
(in v_kill_id bigint,in v_phone bigint,in v_kill_time timestamp,out r_result int)
begin -- 開始儲存過程
declare insert_count int default 0; -- 新建乙個變數,並賦值
start transaction; -- 啟動乙個事務
select * from seckill;
select found_rows() into insert_count; -- 返回查詢到的行數,並賦值給 變數。
insert ignore into success_killed (seckill_id,user_phone,create_time) values (v_kill_id,v_phone,v_kill_time);
select row_count() into insert_count; -- 返回insert影響的行數,並賦值給 變數。
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_kill_id and end_time > v_kill_time and start_time < v_kill_time and number>0;
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;
end; -- 儲存過程結束
$$-- 儲存過程結束
delimiter ;
set @r_result = -3; -- 新建乙個變數
call execute_seckill (1000,15412375874,now(),@r_result); -- 呼叫儲存過程
select @r_result; -- 獲取結果
-- 儲存過程
-- 1:儲存過程優化:事務行級鎖持有的時間
-- 2:不要過度使用儲存過程
-- 3:簡單的邏輯可以應用儲存過程
-- 4:ops:乙個秒殺6000/qps
正在成長中
mysql儲存過程 MySQL儲存過程
在本節中,您將逐步學習如何在mysql中編寫和開發儲存過程。首先,我們向您介紹儲存過程的概念,並討論何時使用它。然後,展示如何使用過程 的基本元素,如建立儲存過程的語句,if else,case,loop,儲存過程的引數。下面每個教程都包含了易於理解的示例和詳細的說明。如果您瀏覽並學習所有教程,您可...
mysql 儲存過程 mysql 儲存過程
建立 為建立儲存過程的結束標誌,使用delimiter 可更改標誌 格式create procedure begin sqlend create procedure myprocedure in param integer begin select from tb role where tb rol...
mysql 儲存過程 MySQL儲存過程
目錄 儲存過程 簡介是一組為了完成特定功能的sql語句集合 比傳統sql速度更快 執行效率更高 儲存過程的優點 執行一次後,會將生成的二進位制 駐留緩衝區,提高執行效率 sql語句加上控制語句的集合,靈活性高 在伺服器端儲存,客戶端呼叫時,降低網路負載 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫...