看板 PHP 關於我們 聯絡資訊
請問一下各位大大, 最近碰到一個問題 我有一支API, 這支API所做的事情如下: step 1. 檢查金額是否足夠(抓DB) step 2. 如果足夠則進行扣款(抓DB) 但我想到一種情況是, 假設目前錢包有100元, 商品價格100元 當兩個使用者同時呼叫該API 有可能同時執行了step1, 所以都取到金額為100元, 所以這兩個使用者都會購買成功, 因為PHP 不支援多執行緒lock的機制, 我想請問一般都要如何避免這種情況? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 202.39.9.79 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1503023549.A.182.html ※ 編輯: tas72732002 (202.39.9.79), 08/18/2017 10:40:34
agreerga: 只鎖住step2的扣款動作? 08/18 10:47
cf1064: db的select for update? 08/18 10:57
dinos: step2的where加上判斷餘額是否足夠 08/18 11:26
st1009: 時間鎖,你抓DB到正式修改資料之間有等待時間確認是否有同 08/18 14:55
st1009: 時操作 08/18 14:55
xdraculax: transaction or lock table 08/18 22:18
z20240: update table set price = newPrice where price is enoug 08/19 17:23
z20240: h ; 08/19 17:23
dou0228: db with transaction 08/22 23:18
yanli2: 要扣款前再抓一次DB 並且延遲幾秒 08/25 03:03
angelmark: db的autocommit先關閉 在下select時加上for update 09/01 18:07
angelmark: 成功執行完後再把autocommit開啟 09/01 18:08