作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个:
$scCost = $row["gpsc"];
mysql_query("
UPDATE member_profile
SET points = points-$scCost
WHERE user_id = '".mysql_real_escape_string($userid)."'
") or die(mysql_error());
这需要用户的积分 - scCost。
如何检查用户是否负担得起?因此,如果用户有 30 个且 $scCost 为 40..
最佳答案
您可以通过向查询添加额外条件并使用 mysql_affected_rows()
以原子方式完成此操作:
$scCost = $row["gpsc"];
$user_id = mysql_real_escape_string($user_id);
$sql = <<<END
UPDATE member_profile
SET points = points - $scCost
WHERE user_id = $user_id
AND points >= $scCost
END;
mysql_query($sql);
if (mysql_affected_rows() > 0) {
// they can afford it
}
这比先执行 SELECT
后执行 UPDATE
要好得多,后者会引入竞争条件。
警告: mysql_affected_rows()
返回已更改的行数。。理解这一点很重要。如果您将 0 成本传递给此查询,您最终会得到:
UPDATE member_profiles SET points = points - 0 ...
在这种情况下,
mysql_affected_rows()
将始终返回 0,因为没有行发生更改。因此,如果 0 成本是有效的情况,您需要对此进行过滤,而根本不必运行查询。
如果您要更新一行,这也很有效,但如果您想一次修改多行,它就会变得有点困难。然后你会遇到这样的问题:
您可能最好一次执行一个UPDATE
,尽管这通常不是推荐的方法,而且肯定不会一次扩展到数千个更新。
关于PHP 如何检查自己是否负担得起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2330406/
速度、优化和可伸缩性是 Udp 和 Tcp 协议(protocol)之间的典型比较。 Tcp 吹捧可靠性,缺点是有一点额外的开销,但速度非常好。一旦 Tcp 套接字被实例化,保持套接字打开需要一些开销
我是一名优秀的程序员,十分优秀!