搶購功能的實現 PHP MySQL

2021-07-09 03:17:21 字數 1623 閱讀 9693

搶購功能的實現[php+mysql]

鄧強 本文**:

業務背景:

某公司開展活動,4個實體店,每天限量發放10個優惠券,供人們搶購。

技術分析:

一旦涉及搶購,必然會引起併發問題,而且還盡量保證程式的併發性,這就要求或者在程式中做同步,或者在資料庫層次做同步。一般來說,在程式端做同步(synchronize),會導致阻塞得很厲害。使用資料庫同步,可以選擇有行級鎖的資料庫以及提高事務隔離等級,但提高事務等級會將事務序列化(serializable),嚴重降低程式併發。綜上權衡,我選擇了php+mysql。以我的認知,oracle與mysql都可以,mssql卻沒找到類似功能。

主要解決方法:

2.建立資料庫時要使用innodb儲存引擎

3.在資料庫中建立儲存過程,在儲存過程中使用事務,在事務中要先查詢是否發放完畢,為避免多程序同時訪問某記錄中的數量而引起的問題,我使用for update。使用該語句,若事務a訪問訪問該記錄時,事務b會阻塞,直到事務a完畢後,從而達到了《並轉串》的操作。

以下是解決該問題的核心儲存過程,其中有2個入參,1個出參。

create

definer=`sa`@`localhost`

procedure

in`p_store_id`

varchar

(30), 

in`p_phone_number`

varchar

(20),

outreturn_val

varchar

(30))

begin

#routine body goes here... 

declare

int(4)

default

0; declare

varchar

(16)

default

''; 

start 

transaction

;//開始事務 

select

into

from

max_table 

where

store_id=p_store_id

forupdate

; then

insert

into

values

(p_store_id,0);

endif; 

then

set'優惠券碼的生成規則'

, insert

into

values

update

max_table

setwhere

store_id=p_store_id;

set 

endif; 

setreturn_val=result ;

commit

; //提交事務,同時釋放

forupdate

鎖 end

4.php呼叫mysql儲存過程 

$sql = 

."'$store_id',"

."'$phonenumber',"

."@return_val"

.'); '; 

$db->query($sql); 

);  

flask redis實現搶購(秒殺)功能

今天面試了 一家非常高大上的公司,問了我關於redis的實用性問題,但是答的不是很好,所以下午通過再次學習 redis,實現相關實用性功能的一種。對於搶購功能,難點在於 搶購時 由於高併發請求,導致乙個使用者搶購多件商品,庫存量小於訂單量的情況。如下通過redis的hash和list型別實現相關功能...

PHP MySQL實現簡單的分頁功能

今天對之前的使用者管理模組實現了乙個簡單的分頁功能,大致樣式如下 接下來談談具體實現的步驟 1 既然涉及到分頁,首先肯定是從資料庫獲取的資料就有限制,這個限制就是用limit,比如下面這個sql語句 sql select from users order by id desc limit 0,3 其...

redis實現高併發下的搶購 秒殺功能

常規寫法 查詢出對應商品的庫存,看是否大於0,然後執行生成訂單等操作,但是在判斷庫存是否大於0處,如果在高併發下就會有問題,導致庫存量出現負數 redis的解決方案 1,inlcude oncea include db.php redis new redis resid connect 127.0....