2015-09-28 80 views
0

我正在运行一个短信发送网站。当用户发送消息时,需要从他们的账户中扣除1个信用点。更新Mysql多个请求在1秒

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

下面是如何更新数据库:

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

回答

0

你已经有了几次要求都争着把自己的想法是正确的值到数据库中。因此,两个请求同时到达,他们都将信用级别读为“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或类似的技术更新 - 如果没有行被更新,那么他们的话费不足。如果是,那么他们有信贷,并已被成功扣除。

有关避免这些各种各样的比赛条件更加技术,see this question

最后,请注意,using the mysql_ PHP functions is deprecated