Php 在1秒内根据多个请求更新Mysql

Php 在1秒内根据多个请求更新Mysql,php,mysql,Php,Mysql,我正在运行一个短信发送网站。当用户发送消息时,需要从其帐户中扣除1个积分 但是,当用户快速提交请求时,帐户不会正确递减。例如,用户从10个积分开始,快速提交3个请求,但数据库将余额存储为9个积分,而不是7个 以下是我如何更新数据库: $sql5="update sms set sms='$remaining_sms' WHERE username='$session_username'"; $result5=mysql_query($sql5); 您有几个请求,所有这些请求都在竞相将他们认为正

我正在运行一个短信发送网站。当用户发送消息时,需要从其帐户中扣除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=?
然后检查是否使用或类似的技术更新了一行-如果没有更新任何行,则表示它们已过期。如果是的话,那么他们就有了信用,并且成功地扣除了它

要了解更多避免此类比赛条件的技巧

最后,请注意