在1秒内对多个请求更新Mysql


UPDATE Mysql On Multiple Request In 1 Seconds

我正在运行一个短信发送网站。当用户发送消息时,需要从其帐户中扣除1个信用。

但是,当用户快速提交请求时,帐户没有正确递减。例如,用户一开始有10个积分,很快提交了3个请求,但数据库将余额存储为9个积分,而不是7个!

下面是我更新数据库的方法:

$sql5="update sms set sms='$remaining_sms' WHERE username='$session_username'";
$result5=mysql_query($sql5);

有几个请求都在争先恐后地将它们认为正确的值放入数据库。因此,两个请求同时到达,它们都读取信用等级为'10',发送消息,然后都写入'9'作为新的信用等级。

相反,让数据库为您递减

$sql5="update sms set sms=sms-1 WHERE username='$session_username'";
$result5=mysqli_query($link, $sql5);

这将保持正确的信用水平,但在重载情况下,这可能会变为负值,因此用户可以发送比他们有信用更多的消息!

为了防止这种情况,您需要一个查询,该查询既可以减少帐户,也可以告诉它们是否有任何信用。像这样简单的操作就可以达到目的:
UPDATE sms SET sms=sms-1 WHERE sms>0 AND username=?

然后检查是否使用mysqli_affected_rows或类似的技术更新了一行—如果没有更新行,则它们已过期。如果是,那么他们就有信用,并且已经成功扣除了。

有关避免这类竞态条件的更多技术,请参见这个问题

最后,请注意不建议使用mysql_ PHP函数