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