[請益] 如何避免按鍵精靈的攻擊

看板PHP作者 (蔥頭)時間6年前 (2017/08/18 10:32), 6年前編輯推噓4(408)
留言12則, 9人參與, 最新討論串1/1
請問一下各位大大, 最近碰到一個問題 我有一支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

08/18 10:47, , 1F
只鎖住step2的扣款動作?
08/18 10:47, 1F

08/18 10:57, , 2F
db的select for update?
08/18 10:57, 2F

08/18 11:26, , 3F
step2的where加上判斷餘額是否足夠
08/18 11:26, 3F

08/18 14:55, , 4F
時間鎖,你抓DB到正式修改資料之間有等待時間確認是否有同
08/18 14:55, 4F

08/18 14:55, , 5F
時操作
08/18 14:55, 5F

08/18 22:18, , 6F
transaction or lock table
08/18 22:18, 6F

08/19 17:23, , 7F
update table set price = newPrice where price is enoug
08/19 17:23, 7F

08/19 17:23, , 8F
h ;
08/19 17:23, 8F

08/22 23:18, , 9F
db with transaction
08/22 23:18, 9F

08/25 03:03, , 10F
要扣款前再抓一次DB 並且延遲幾秒
08/25 03:03, 10F

09/01 18:07, , 11F
db的autocommit先關閉 在下select時加上for update
09/01 18:07, 11F

09/01 18:08, , 12F
成功執行完後再把autocommit開啟
09/01 18:08, 12F
文章代碼(AID): #1Pbb6z62 (PHP)