问题:如何防止某人使用促销代码两次?

我有一个看起来像这样的数据库:

数据库

当用户想要使用促销代码时,它首先检查 used_promo 是否为空,这意味着用户之前没有使用过任何促销代码。 (用户只能使用 1 个促销代码)

我可以做这样的事情

SELECT used_promo FROM users WHERE id=5

然后我可以用 PHP 检查 used_promo 是否为空,如果是,我可以

UPDATE users SET used_promo=2, balance=balance+100 WHERE id=5

是否有可能用户可以同时尝试多次使用促销代码,SELECT 会返回 used_promo 在设置为 2 之前为 null 并且余额将多次添加?

解答

在您描述的场景中,理论上可以多次使用促销代码。使用单个查询,如果更新成功,它将返回一个 id,否则没有行。

UPDATE users 
SET used_promo=2, balance=balance+100 
WHERE id=5 AND used_promo is null
RETURNING id;
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐