yml2213
631e33a4f6
fix(events): 撞唯一键是幂等命中,不该刷 WARNING + dump 整条 SQL
## 现象(用户从日志里发现的)
WARNING | 写入账号事件失败(account=60 exchange):
(1062, "Duplicate entry 'official_exchange:elite:60:20260120QYOOB_bag360:...'")
[SQL: INSERT INTO account_events (...) VALUES (...)]
[parameters: {...}]
## 分析:**不是 bug,是幂等机制在工作,但日志级别错了**
`emit()` 刻意**不做预检查**,直接 INSERT,靠 `source_ref` 的唯一索引去重;
撞了就 catch(SAVEPOINT 只回滚这一条)。所以:
- **数据是对的** —— 重复的被挡住,`exchange_events_added` 只计新写入的
- **日志是错的** —— 撞唯一键被当成异常打 WARNING,还把整条 SQL + 参数 dump 出来
而"撞唯一键"在这里是**预期内的正常情况**:一键查询会把斗鱼官方兑换记录补成事件,
同一个账号会被反复查询 —— 第二次开始每条记录都会撞。一次查询能刷几十屏,
既淹掉真日志、又让人以为出事了(用户就是因此来问的)。
## 修法
区分「唯一键冲突」与「真错误」:
- 确认是 **1062**(并带 `Duplicate entry` 字样)→ 降为 **DEBUG**,一句话说明"已存在,跳过"
- 其它完整性错误(如非空约束 1048)→ **仍然是 WARNING**
刻意**不把 IntegrityError 整个静音** —— 那会把真问题一起藏起来。
新增 `_is_duplicate_entry()` 只在两种信号都对上时才降级。
## 测试(+3)
- 重复写入返回 False,且**不产生**任何 "写入账号事件失败" 的 WARNING
(用 loguru 的临时 sink 真的抓日志来断言,不是看代码)
- 重复写入不会写进第二条
- `_is_duplicate_entry` 只认 1062,1048(非空约束)仍然返回 False
2026-10-04 20:35:24 +08:00
..
2026-10-02 21:22:08 +08:00
2026-10-02 21:22:08 +08:00
2026-10-04 15:21:48 +08:00
2026-10-04 17:49:02 +08:00
2026-10-04 17:34:58 +08:00
2026-10-04 16:00:42 +08:00
2026-10-04 20:04:11 +08:00
2026-10-04 20:35:24 +08:00
2026-10-02 21:22:08 +08:00
2026-10-02 21:22:08 +08:00
2026-10-04 14:10:13 +08:00
2026-10-04 14:48:22 +08:00
2026-10-04 18:10:46 +08:00
2026-10-04 14:10:13 +08:00
2026-10-04 14:30:02 +08:00
2026-10-04 14:10:13 +08:00
2026-10-04 14:10:13 +08:00
2026-08-31 10:28:14 +08:00
2026-08-31 10:28:14 +08:00
2026-10-04 16:28:06 +08:00
2026-10-02 21:01:17 +08:00
2026-10-04 16:28:06 +08:00
2026-08-31 10:28:14 +08:00
2026-08-31 10:28:14 +08:00
2026-10-04 14:10:13 +08:00
2026-10-04 16:00:42 +08:00
2026-10-04 14:10:13 +08:00
2026-10-04 16:28:06 +08:00
2026-08-31 10:28:14 +08:00
2026-10-02 22:50:20 +08:00
2026-10-02 22:50:20 +08:00
2026-08-31 10:28:14 +08:00
2026-09-05 19:25:46 +08:00
2026-10-02 21:22:08 +08:00
2026-10-02 21:22:08 +08:00
2026-09-02 16:59:46 +08:00
2026-09-06 13:02:37 +08:00
2026-10-02 21:22:08 +08:00
2026-08-30 23:05:20 +08:00
2026-09-02 18:11:41 +08:00
2026-09-06 13:56:44 +08:00
2026-09-05 19:25:46 +08:00
2026-10-02 21:22:08 +08:00
2026-10-02 20:27:07 +08:00
2026-09-06 13:56:44 +08:00
2026-09-02 18:11:41 +08:00
2026-10-02 21:22:08 +08:00
2026-08-31 10:55:44 +08:00
2026-10-04 14:10:13 +08:00
2026-10-02 21:22:08 +08:00
2026-10-04 14:10:13 +08:00
2026-10-04 20:17:05 +08:00
2026-10-02 21:22:08 +08:00
2026-10-02 21:22:08 +08:00