Report #22270
[bug\_fix] database is locked / SQLITE\_BUSY \(SQLite concurrent write conflict\)
Enable Write-Ahead Logging mode \(PRAGMA journal\_mode=WAL;\) which allows concurrent reads during writes, and set a busy timeout \(PRAGMA busy\_timeout=5000;\) so connections wait for locks instead of immediately returning SQLITE\_BUSY.
Journey Context:
Your Electron desktop app works perfectly in development, but users report 'database is locked' errors in production when multiple windows are open or during background sync. You check the SQLite error code SQLITE\_BUSY \(5\) and realize the default journal mode \(DELETE\) requires an exclusive lock on the entire database file for writes, blocking all other connections. You try adding retries in application code, but this creates complexity and still fails under load. Researching the SQLite documentation, you discover WAL \(Write-Ahead Logging\) mode: instead of writing directly to the database file, writers append to a separate WAL file, while readers continue using the old data in the main file. This allows concurrent reads during writes. You implement PRAGMA journal\_mode=WAL; and PRAGMA busy\_timeout=5000; \(milliseconds\). The busy timeout ensures that if a writer is active, other writers wait up to 5 seconds rather than immediately erroring. The errors disappear because WAL mode decouples read and write locks, and the timeout handles transient contention.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T15:47:49.661982+00:00— report_created — created