在我的mysql数据库中发生了一些非常奇怪的事情。我有一个脚本,采取用户的ip地址,并将其保存在数据库中的5分钟。通过这样做,我可以显示当前在我的网站上活跃的人数。该脚本还会检查数据库中的ip地址是否已准备就绪。现在发生的事情是,总是有一个谷歌机器人带着一个特定的ip地址来。这个ip地址在我的数据库中保存了大约40次,所有的条目都有完全相同的时间戳。虽然我的脚本实际上是在将ip地址写入数据库之前检查ip地址是否已经存在,但这怎么可能呢?
谢谢你,菲尼
发布于 2011-02-26 08:03:43
所以你有类似这样的东西:
if(!already_exists($ip))
insert_into_db($ip)这是一个很好的race condition示例,因为您的PHP脚本将并行运行,每个请求一个。
想象一下,当您有40个请求大致同时执行第一个if时,在数据库响应到来之前会发生什么情况……他们都认为IP地址不存在,并将其插入。
您可以使用ON DUPLICATE KEY UPDATE查询来解决此问题。
INSERT INTO visitors values (NOW(),$ip) ON DUPLICATE KEY UPDATE ts = NOW();如果记录不存在,将插入该记录,如果存在,将更新ts列。
您需要包含IP地址的列上的UNIQUE索引才能执行此操作。
https://stackoverflow.com/questions/5124046
复制相似问题