當你決定使用存儲過程的時候,那么整個事務是在MYSQL端完成的。
對于事務競爭優化的主要一點就是減少事務鎖時間。
你選擇了使用存儲過程就可以不用再代碼中開啟事務,深度優化即將事務SQL在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)
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;
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;
END if;
END;
$$
-- 存儲過程定義結束
DELIMITER ;set @r_result=-3;
-- 執行存儲過程
call execute_seckill(1003,18820116735,now(),@r_result);
-- 獲取結果select @r_result;
這屬于并發優化的階段了,不要過度依賴存儲過程,其一般用于簡單的邏輯