mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-10 00:33:28 +08:00
复现路径:SQL 编辑器执行 DELETE 进入托管事务后不点提交、直接刷新前端,再执行同一条 DELETE, 会卡满 innodb_lock_wait_timeout(默认 50 秒)并报 Error 1205 Lock wait timeout exceeded, 只能重启应用才能恢复。 根因:待提交事务的 ID 只存在于前端组件内存(useSqlEditorTransactionController 的 useState/useRef),持久化状态里只有 commitMode/autoCommitDelayMs 这类设置。前端一旦刷新, 残留在 a.sqlTransactions 中的条目就再也无法被提交或回滚,却仍开着并持有 pinned 连接与行锁。 原先只有显式提交/回滚与应用退出(rollbackPendingSQLTransactionsOnShutdown)两条清理路径, 刷新不经过其中任何一条。 - 新增 Wails OnDomReady 钩子(每次 WebView 导航完成即触发,刷新必然命中), 回滚所有已无法被引用的托管事务。首次加载时事务表为空,故无副作用; 本应用是 React SPA,正常使用中不会产生整页导航,不会误杀活跃事务 - rollbackPendingSQLTransactionsOnShutdown 抽出公共实现,审计来源区分 app_shutdown 与 frontend_reload,便于事后区分两类自动回滚 - 补 4 项回归测试:回滚并释放会话、空表无副作用、nil 容错、已完成事务不重复回滚。 已确认禁用钩子后首个用例必定失败(回滚 0 次) 顺带说明:界面把 Error 1205 归类为「查询超时或被取消」并建议「检查执行计划、调整超时时间」 是误导——1205 是行锁等待超时,成因是另一事务持锁。该错误语义映射未在本次修改范围内。