對於商品搶購等併發場景下,可能會出現超賣的現象,這時就需要解決併發所帶來的這些問題了。
在php語言中並沒有原生的提供併發的解決方案,因此就需要借助其他方式來實現併發控制。
方案一:使用檔案鎖排它鎖
flock函式用於獲取檔案的鎖,這個鎖同時只能被乙個執行緒獲取到,其它沒有獲取到鎖的執行緒要麼阻塞,要麼獲取失敗。在獲取到鎖的時候,先查詢庫存,如果庫存大於0,則進行下訂單操作,減庫存,然後釋放鎖。
方案二:使用mysql資料庫提供的悲觀鎖
innodb儲存引擎支援行級鎖,當某行資料被鎖定時,其他程序不能對這行資料進行操作。
先查詢並鎖定行:
select stock_num from table where id=1 for updateif(stock_num > 0)
方案三:使用佇列將使用者的下單請求依次存入乙個佇列中,後台用乙個單獨的程序處理佇列中的下單請求。
方案四:使用redis
redis的操作都是原子性的,可以將商品的庫存存入redis中,下單之前對庫存進行decr操作,如果返回的值大於等於0等可以下單,否則不能下單,這種方式效率較高。
if(redis->get('stock_num') > 0)else}else
C 併發處理 鎖OR執行緒安全?
每次寫部落格,第一句話都是這樣的 程式設計師很苦逼,除了會寫程式,還得會寫部落格!當然,題外話說多了,咱進入正題!背景 基於任務的程式設計 命令式資料並行和任務並行都要求能夠支援併發更新的陣列 列表和集合。在.net framework 4 以前,為了讓共享的陣列 列表和集合能夠被多個執行緒更新,需...
redis鎖機制處理高併發
這裡我們主要利用redis的setnx的命令來處理高併發。setnx 有兩個引數。第乙個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回 1。如果當前鍵存在,那麼會返回0。建立庫存表 create table storage id int 11 unsign...
sqlserver併發處理,鎖和事務
本文系 謝謝 另外這個也不錯 鎖的概述 一.為什麼要引入鎖 多個使用者同時對資料庫的併發操作時會帶來以下資料不一致的問題 丟失更新 a,b兩個使用者讀同一資料並進行修改,其中乙個使用者的修改結果破壞了另乙個修改的結果,比如訂票系統 髒讀 a使用者修改了資料,隨後b使用者又讀出該資料,但a使用者因為某...