MySQL儲存過程

2021-07-22 09:04:53 字數 3949 閱讀 6423

-- 資料庫初始化指令碼

-- 建立秒殺庫存表

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語句加上控制語句的集合,靈活性高 在伺服器端儲存,客戶端呼叫時,降低網路負載 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫...