-- 資料庫初始化指令碼
-- 建立秒殺庫存表
create
table seckill(
`seckill_id`
bigint
notnull
auto_increment
comment
'商品庫存id'
,`name`
varchar
(120
)not
null
comment
'商品名稱'
,`number`
intnot
null
comment
'庫存數量'
,`start_time`
timestamp
notnull
comment
'秒殺開始時間'
,`end_time`
timestamp
notnull
comment
'秒殺結束時間'
,`create_time`
timestamp
notnull
default
current_timestamp
comment
'秒殺建立時間'
,primary
key(
`seckill_id`),
/*建立時間索引是為了以後時間查詢的業務提供方便*/
key`idx_start_time`
(`start_time`),
key`idx_end_time`
(`end_time`),
key`idx_create_time`
(`create_time`))
engine
=innodb
auto_increment
=1000
default
charset
=utf8 comment
='秒殺庫存表'
;-- 初始化資料
insert
into
seckill(name, number, start_time, end_time)
values
('1000元秒殺iphone6'
,100
,'2015-11-01 00:00:00'
,'2015-11-02 00:00:00'),
('500元秒殺ipad2'
,200
,'2015-11-01 00:00:00'
,'2015-11-02 00:00:00'),
('300元秒殺小公尺4'
,300
,'2015-11-01 00:00:00'
,'2015-11-02 00:00:00'),
('200元秒殺紅公尺note'
,400
,'2015-11-01 00:00:00'
,'2015-11-02 00:00:00');
-- 秒殺成功明細表
-- 使用者登入認證相關的資訊
create
table success_killed(
`seckill_id`
bigint
notnull
comment
'商品庫存id'
,`user_phone`
bigint
notnull
comment
'使用者手機號'
,`state`
tinyint
notnull
default-1
comment
'狀態資訊:-1無效,0成功,1已付款,2已發貨'
,`create_time`
timestamp
notnull
comment
'建立時間'
,primary
key(
`seckill_id`
,`user_phone`),
/*聯合主鍵*/
key`idx_create_time`
(`create_time`))
engine
=innodb
default
charset
=utf8 comment
='秒殺庫存表'
;
-- 秒殺執行儲存過程
delimiter $$ -- onsole ; 轉換為 $$
-- 定義儲存過程
-- 引數:in 輸入引數; out 輸出引數
-- row_count():返回上一條修改型別sql(delete,insert,upodate)的影響行數
-- row_count: 0:未修改資料; >0:表示修改的行數; <0:sql錯誤/未執行修改sql
create
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
default0;
start
transaction
;insert
ignore
into success_killed (seckill_id, user_phone, create_time)
values
(v_seckill_id, v_phone, v_kill_time)
;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 -
1where seckill_id = v_seckill_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;
endif
;endif;
end;
$$-- 代表儲存過程定義結束
delimiter
;set
@r_result=-
3;-- 執行儲存過程
call execute_seckill(
1001
,13631231234
,now()
,@r_result);
-- 獲取結果
select
@r_result
;-- 儲存過程
-- 1.儲存過程優化:事務行級鎖持有的時間
-- 2.不要過度依賴儲存過程
-- 3.簡單的邏輯可以應用儲存過程
-- 4.qps:乙個秒殺單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語句加上控制語句的集合,靈活性高 在伺服器端儲存,客戶端呼叫時,降低網路負載 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫...