搶購功能的實現[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....