首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在1秒内更新多个请求的Mysql

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

Stack Overflow用户
提问于 2015-09-28 15:58:04
回答 1查看 69关注 0票数 0

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

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

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

代码语言:javascript
运行
复制
$sql5="update sms set sms='$remaining_sms' WHERE username='$session_username'";
$result5=mysql_query($sql5);
EN

回答 1

Stack Overflow用户

发布于 2015-09-28 16:01:31

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

相反,让数据库为您递减它

代码语言:javascript
运行
复制
$sql5="update sms set sms=sms-1 WHERE username='$session_username'";
$result5=mysqli_query($link, $sql5);

这将保持正确的信用级别,但在重负载下,这可能会变成负值,因此用户可以发送比他们的信用更多的消息!

为了防止这种情况,您需要一个查询,它既可以减少帐户,也可以告诉他们是否有任何信用。像这样简单的事情就能达到目的:

代码语言:javascript
运行
复制
UPDATE sms SET sms=sms-1 WHERE sms>0 AND username=?

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

有关避免这些类型的竞争条件的更多技术,请参阅see this question

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32818187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档