首页 > 解决方案 > 访问计数器的 Sql 查询未按预期工作

问题描述

以下经典 ASP 代码用于统计网站的每日页面访问量。然后检查最后一条记录的日期:

然而,每天都有多个不需要的记录,重复日期有 1 次或 2 次或 3 次访问,还有一个真实记录,比如同一日期有 10000 次访问。重复记录的可能原因有哪些?

recordset.open "select top 1 id from visit order by id desc",objcon
    if recordset("mdate")=today then
    
        sql="update visit set counter=counter+1 where id=" & recordset("id")
        objcon.execute sql
        
        else
        
        sql="insert into visit (mdate,counter) values ('" & today & "','1')"
        objcon.execute sql
    
    end if
recordset.close

标签: sqlasp-classic

解决方案


这听起来像是一种竞争条件。同一个id同时访问两次。他们俩都运行查询,发现id不在表中。瞧!他们俩都决定插入一个新行。你得到重复。

有几种方法可以解决这个问题。一种是在整个过程中锁定表。我想我更喜欢以下内容:

  • 在 上定义一个唯一索引(id, date),这样数据库就保证了唯一性。
  • 尝试insert使用计数为 1 的新行。
  • 如果insert失败,则将计数更新 1。

推荐阅读