[请益] 如何避免按键精灵的攻击

楼主: 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