Report #60566
[bug\_fix] database is locked \(SQLITE\_BUSY\) – concurrent access conflict
Enable WAL mode \(PRAGMA journal\_mode=WAL\) to allow readers to not block writers, and set PRAGMA busy\_timeout=5000 to let SQLite retry internally before returning SQLITE\_BUSY.
Journey Context:
A desktop Electron app uses SQLite with default DELETE journal mode. When the user opens a large export \(long read transaction\), the UI tries to save a setting \(write transaction\). The write immediately returns 'database is locked'. The developer implements a manual retry loop with sleep, but users still see errors under load. Reading the SQLite docs, the developer learns that DELETE mode requires exclusive locks for writes, blocking readers, and readers block writers. They execute PRAGMA journal\_mode=WAL; this creates a -wal file. Now, the long read no longer blocks the write; both proceed. However, under heavy concurrent writes, they still see occasional SQLITE\_BUSY. They add PRAGMA busy\_timeout=5000; SQLite now internally retries lock acquisition for 5 seconds before returning an error, smoothing out the remaining contention.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T08:08:47.377221+00:00— report_created — created