首页 > 解决方案 > 如果 1 位用户在 2 个不同的浏览器/设备上登录并同时购买 1 件商品会怎样?

问题描述

所以想象一下我有一个网站(PHP + MYSQL),我的网站有一个登录页面并出售香蕉,我的网站也有“积分”,用户可以通过贝宝充值以添加更多积分。

假设用户 1 的信用额度为 1 美元,而 1 个香蕉的价格为 1 美元,如果用户 1 在 2 个不同的设备上登录并同时购买 1 个香蕉,这算作购买了 2 个香蕉还是购买了 1 个香蕉而另一个香蕉被拒绝了呢?

如果买了 2 个香蕉,有什么办法可以防止这个 MULTIPLE SIMULTAEOUSLY REQUEST 吗?

标签: phpmysqlconcurrencytransactions

解决方案


将此过程作为单个事务进行是一种很好的做法。这样,数据就会被读取、处理,然后及时创建/更新。这本身是可行的,因为两个事务不会同时运行。

($pdo = new PDO))->beginTransaction();
$read = $pdo->Prepare(“Some select statement”);
$read->execute(array(‘someVal’));
if(($row = $read->fetch(PDO::FETCH_OBJ)) && (float) $row->wallet >= 1.0) {
    $update = $pdo->Prepare(‘Some update wallet statement’):
    $update->execute();
    $create = $pdo->Prepare(“create a new transaction”);
    $create->execute(array(‘some val’));
}
$pdo->commit();

或者,或者为了额外的预防措施,您可以在脚本执行之间植入一个小的随机等待时间,以防止定时攻击,但网络延迟应该会阻止这种情况。

更新:我想谈谈安全性。尽管 PDO(如果正确使用 emulate prepares 设置为 false)确实可以防止大多数常见的漏洞,如 SQL 注入,但事务会受到竞争条件的影响。确保您限制区块链并遵循安全程序以确保限制竞争条件。


推荐阅读