Report #8299
[bug\_fix] SQLITE\_BUSY: database is locked
Enable WAL mode \(\`PRAGMA journal\_mode = WAL\`\) and set a busy timeout \(\`PRAGMA busy\_timeout = 5000\`\). Root cause: SQLite uses POSIX advisory file locks. In default DELETE journal mode, writes require exclusive locks blocking all reads. WAL \(Write-Ahead Logging\) mode allows concurrent reads during a single write, but if the writer is temporarily blocked by a reader, \`busy\_timeout\` prevents immediate SQLITE\_BUSY \(code 5\) errors by retrying for the specified duration.
Journey Context:
iOS app with Core Data \(SQLite backend\) crashes during background sync with 'database is locked'. Developer uses FMDatabaseQueue \(serial queue\) but background analytics queries use separate connection. Main thread tries to write user action while background thread holds long-running SELECT. Investigation shows SQLite in DELETE journal mode. Developer tries adding \`PRAGMA busy\_timeout = 1000\` but still gets busy errors because multiple writers attempt simultaneous access. Realizes DELETE mode cannot support concurrent access at all. Switches to WAL mode via \`PRAGMA journal\_mode = WAL\`, allowing readers to proceed during writes. Sets \`busy\_timeout = 5000\` to handle writer-starvation scenarios where a brief reader blocks the single writer. App stability improves; -wal file grows temporarily but checkpoints correctly.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T05:11:25.095042+00:00— report_created — created