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

时间:2015-09-28 07:58:04

标签: php mysql

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

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

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

{{1}}

1 个答案:

答案 0 :(得分: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