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

作者: tas72732002 (蔥頭)   2017-08-18 10:32:27
請問一下各位大大, 最近碰到一個問題
我有一支API, 這支API所做的事情如下:
step 1. 檢查金額是否足夠(抓DB)
step 2. 如果足夠則進行扣款(抓DB)
但我想到一種情況是, 假設目前錢包有100元, 商品價格100元
當兩個使用者同時呼叫該API
有可能同時執行了step1, 所以都取到金額為100元,
所以這兩個使用者都會購買成功,
因為PHP 不支援多執行緒lock的機制, 我想請問一般都要如何避免這種情況?
作者: xdraculax (首席怪叔叔)   2017-08-18 22:18:00
transaction or lock table
作者: st1009 (前端攻城師)   2017-08-18 14:55:00
時間鎖,你抓DB到正式修改資料之間有等待時間確認是否有同時操作
作者: dinos (守護神)   2017-08-18 11:26:00
step2的where加上判斷餘額是否足夠
作者: cf1064 (蚵仔)   2017-08-18 10:57:00
db的select for update?
作者: agreerga (鴨毛)   2017-08-18 10:47:00
只鎖住step2的扣款動作?
作者: z20240 (培根)   2017-08-19 17:23:00
update table set price = newPrice where price is enough ;
作者: dou0228 (7777)   2017-08-22 23:18:00
db with transaction
作者: yanli2 ( Yan™)   2017-08-25 03:03:00
要扣款前再抓一次DB 並且延遲幾秒
作者: angelmark (無言的結局)   2017-09-01 18:07:00
db的autocommit先關閉 在下select時加上for update成功執行完後再把autocommit開啟

Links booklink

Contact Us: admin [ a t ] ucptt.com