我有一个如下所示的数据库:
当用户想要使用促销代码时,它首先检查 used_promo 是否为空,这意味着用户之前没有使用任何促销代码。 (用户只能使用1个促销代码)
我可以做这样的事情
SELECT used_promo FROM users WHERE id=5
然后我可以用PHP查看used_promo是否为null,如果是,我可以
UPDATE users SET used_promo=2, balance=balance+100 WHERE id=5
用户是否可以尝试多次同时使用促销代码,SELECT将返回 used_promo 在设置为2之前为空并且将添加余额多次?
答案 0 :(得分:1)
再创建一个关系表“promo_used”,其中列为:
一旦用户申请促销代码,此表格将有新条目。这样,如果用户再次尝试应用相同的促销代码,我们可以通过搜索此表进行检查。
希望这有帮助。
答案 1 :(得分:1)
在您所描述的场景中,理论上可以多次使用促销代码。使用单个查询,如果更新成功则返回id,否则返回否。
UPDATE users
SET used_promo=2, balance=balance+100
WHERE id=5 AND used_promo is null
RETURNING id;
答案 2 :(得分:0)
据了解,您担心用户可能会在更新used_promo列之前多次使用促销代码。我不知道你的商业模式是什么。但是,在这样的场景中有可能:
用户输入促销代码。您相应地降低了商品的价格,但由于购买不完整,您无法更新used_promo字段。如果没有完成购买,用户输入另一个产品的促销代码并再次获得减少。多次执行此操作后,用户即可完成购买。由于您不会在最后一步检查代码的有效性,因此用户可以降低所有价格。
所以
使用原子方式更新有效性状态,used_promo并完成购买。 (交易)
最终购买前的促销代码