Syngnat
e6d77cd7ab
🐛 fix(transaction): 修复前端刷新后托管事务变成孤儿并长期持有行锁
复现路径: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 是行锁等待超时,成因是另一事务持锁。该错误语义映射未在本次修改范围内。
2026-07-26 22:11:10 +08:00
..
2026-07-26 21:37:22 +08:00
2026-07-26 22:11:10 +08:00
2026-07-26 21:37:22 +08:00
2026-07-24 18:31:40 +08:00
2026-07-24 18:31:40 +08:00
2026-07-24 18:31:40 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 20:36:04 +08:00
2026-07-24 18:31:40 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00
2026-07-23 16:40:44 +08:00
2026-07-26 21:37:22 +08:00
2026-07-22 22:36:19 +08:00
2026-07-26 21:37:22 +08:00
2026-07-23 11:40:17 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 22:11:10 +08:00
2026-07-26 22:11:10 +08:00
2026-07-23 16:10:08 +08:00
2026-07-23 16:10:08 +08:00
2026-07-23 16:10:08 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 21:37:22 +08:00
2026-07-23 16:40:44 +08:00
2026-07-26 21:37:22 +08:00
2026-07-22 22:36:19 +08:00
2026-07-23 16:40:44 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 19:43:41 +08:00
2026-07-22 09:36:57 +08:00
2026-07-22 09:36:57 +08:00
2026-07-23 11:40:17 +08:00
2026-07-23 11:40:17 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 21:37:22 +08:00
2026-07-24 11:29:04 +08:00
2026-07-24 11:29:04 +08:00
2026-07-24 11:29:04 +08:00
2026-07-22 22:36:19 +08:00
2026-07-22 22:36:19 +08:00
2026-07-26 21:37:22 +08:00
2026-07-23 13:07:03 +08:00
2026-07-24 12:00:40 +08:00
2026-07-23 13:07:03 +08:00
2026-07-24 10:19:09 +08:00
2026-07-26 20:36:04 +08:00
2026-07-24 18:31:40 +08:00
2026-07-26 20:36:04 +08:00
2026-07-26 20:36:04 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 20:36:04 +08:00
2026-07-26 21:37:22 +08:00
2026-07-26 19:43:41 +08:00
2026-07-23 13:07:03 +08:00
2026-07-23 13:07:03 +08:00
2026-07-23 13:07:03 +08:00
2026-07-23 13:07:03 +08:00
2026-07-23 14:45:31 +08:00
2026-07-23 14:45:31 +08:00
2026-07-23 13:07:03 +08:00
2026-07-23 13:07:03 +08:00
2026-07-23 13:07:03 +08:00
2026-07-24 10:19:09 +08:00
2026-07-24 10:19:09 +08:00
2026-07-23 13:07:03 +08:00
2026-07-26 19:40:33 +08:00
2026-07-26 19:40:33 +08:00