mirror of
https://github.com/shy3130/tick-stock-panel.git
synced 2026-11-02 10:26:13 +00:00
单连接全局互斥下, 同步期任一长查询(全视图扫描)把所有交互读堵到前端 30s 超时, 不同端点轮流失害 (/status 事故即此形态)。cursor() 本就是同一内存库实例的独立连接 (MVCC 快照隔离; duckdb 1.5.3 实测 6 读线程+2 换视图线程共 1800 次零异常), execute_all/execute_one 改为信号量限并发 (TICK_DUCKDB_READ_CONCURRENCY, 默认 3, 1=完全串行旧行为), 根连接运行期仅作连接工厂。 并发 CREATE OR REPLACE VIEW 同名视图会抛 Catalog write-write conflict (实测), 运行期视图重建一律收口 repo.refresh_view (_ddl_lock 串行, 与读不互斥), 同时消除 kline_sync/daily_pipeline/extend_history/api-kline 共 7 处绕锁直连 db.execute 的线程安全隐患 — 两同步路径同时刷同一视图的静默失败一并修复。 验证: 新增 test_duckdb_read_concurrency (并发重叠/串行回退/视图重建/DDL 零冲突/ 坏名字拒绝/env 钳制) 6 条; 全量 pytest 3479 通过; ruff 码级零新增(消 3 条存量); 基准 376ms 长查询持锁时短读 271ms → 0.1ms。 Signed-off-by: shy3130 <shy3130@qq.com>