sql - 访问计数器的 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
解决方案
这听起来像是一种竞争条件。同一个id同时访问两次。他们俩都运行查询,发现id
不在表中。瞧!他们俩都决定插入一个新行。你得到重复。
有几种方法可以解决这个问题。一种是在整个过程中锁定表。我想我更喜欢以下内容:
- 在 上定义一个唯一索引
(id, date)
,这样数据库就保证了唯一性。 - 尝试
insert
使用计数为 1 的新行。 - 如果
insert
失败,则将计数更新 1。
推荐阅读
- sql - 在 Postgresql 案例语句中将空值设置为默认值
- jquery - 如何在firebase数据库中使用onclick删除项目?
- php - Apache Server 未使用 PHP 脚本返回 HTTP 错误代码
- python - 读取 Excel 分段数据,转换,然后输出为数据库的原始格式
- reactjs - React.JS 处理未定义道具的最佳方法是什么
- javascript - 如何访问此 PHP 对象中的信息?
- perl - Perl 正确读取逗号分隔值的配置值
- php - Wordpress - 为前 4 个帖子设置自定义 CSS 类,并包装 2 个第一个帖子
- c++ - 在qt中执行自己的sql函数
- symfony - (Symfony 4)期望存储库类的函数,当我将其设置为期望实体类时