880 Star 3.6K Fork 1.5K

Discuz / DiscuzX

 / 详情

对 common_stat 插入统计数据时几率性报错 Duplicate entry for key 'PRIMARY'

已完成
成员
创建于  
2021-01-12 00:02

描述此疑似缺陷或需求

对 common_stat 插入统计数据时几率性报错 Duplicate entry for key 'PRIMARY'

疑似缺陷重现步骤 / 新功能流程

#I1F1K7:我不确定这个是不是bug,还没来得及效验discuz的文件。 中由 @cqwq 提出:

每天到零点第一次访问,报错,提示一个时间值不能重复插入,刷新就不报了,每天如此。

输入图片说明

做过哪些尝试

更新程序到 Discuz! X3.4 最新版本

版本信息

  • Discuz! 版本: X3.4
  • Release 版本: 20200818
  • 服务器系统版本: Debian 10
  • PHP 版本: PHP 7.3
  • MySQL / MariaDB 版本: MySQL 8.0
  • 内存缓存类型和版本: 无

其他信息

此处的清空指令 C::t('common_statuser')->clear_by_daytime($nowdaytime); 是否应考虑割接到计划任务体系,避免调用功能时反复判断数据表是否为空。

评论 (5)

老周部落 创建了任务
老周部落 关联仓库设置为Discuz/DiscuzX
老周部落 修改了描述
展开全部操作日志

关于 @cqwq 提到的并发问题,再提供一个测试性方案。使用 MySQL 提供的 ON DUPLICATE KEY UPDATE 处理此并发问题。

https://gitee.com/Discuz/DiscuzX/blob/master/upload/source/class/table/table_common_stat.php#L44

DB::insert($this->_table, array('daytime'=>$nowdaytime, $type=>$num));

改为

DB::query("INSERT INTO ".DB::table($this->_table)." (daytime, $type) VALUES ($nowdaytime, $num) ON DUPLICATE KEY UPDATE $type = $type + $num");
老周部落 修改了描述
老周部落 修改了描述

测试了这段时间,按提供的方法修改后,没再出现报错

测试了这段时间,按提供的方法修改后,没再出现报错

@cqwq 感谢,后续安排 PR 。

@老周部落 请问这个修复方案还不能提交为正式pr吗,最近升级到最新版,所有文件覆盖了一遍,又出现了。还得手工改下。

可以了,我马上提交。

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
1773794 laozhoubuluo 1594507411 4944599 cqwq 1649307094
PHP
1
https://gitee.com/Discuz/DiscuzX.git
git@gitee.com:Discuz/DiscuzX.git
Discuz
DiscuzX
DiscuzX

搜索帮助