我正在运行短信发送网站。当用户发送邮件时,需要从其帐户中扣除1个信用额。
但是,当用户快速提交请求时,帐户不会正确递减。例如,用户以10个学分开始,快速提交3个请求,但数据库将余额存储为9个学分,而不是7个!
以下是我更新数据库的方法:
{{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