作者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/cn.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