再次问好Stackoverflow!
我目前正在开发自定义论坛软件,您希望在论坛上看到的内容之一是视图计数器。
我找到的viewcounter的所有方法都只是从数据库中选择主题,从“views”列中检索数字,添加一个并更新它。
但是这是我的想法:如果,让我们说400,人们在同一时间打开一个主题,MySQL数据库可能不会计算所有视图,因为查询完成需要时间,所以最后一个人( 400)可能会覆盖第一批人(400人)的观点。
当然,人们可以争辩说,在正常的网站上,这种情况永远不会发生,但是如果你有大约7个人在完全相同的时间打开那个主题而且服务器在那个时刻正在努力,你可能会遇到同样的问题。
还有其他好方法来计算观点吗?
修改
哇,投票的人可以说出原因吗?我选择“检索视图数量并添加一个”,我将使用SELECT
来检索数字,使用PHP添加一个(注意标记)并使用UPDATE
进行更新。我不知道下面指定的其他方法,这就是我问的原因。
答案 0 :(得分:2)
如果,让我们说400,人们在同一时间打开一个主题,那么MySQL数据库显然会计算所有视图,因为这正是数据库的发明。
您找到的查看计数器的所有方法都是错误的。要更新字段,您不需要检索它,但只是已经更新:
UPDATE forum SET views + 1 WHERE id = ?
答案 1 :(得分:1)
这样的事情会起作用:
UPDATE tbl SET cnt = cnt+1 WHERE ...
UPDATE
保证是原子的。这意味着没有人能够在阅读时间和更换时间之间改变cnt
。如果同一行(InnoDB)或表(MyISAM)有多个并发UPDATE
,则必须等待轮到他们更新日期。
参见Is incrementing a field in MySQL atomic?
和http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-transactions.html