Report #72169
[bug\_fix] sqlite3.OperationalError: database is locked \(SQLITE\_BUSY\)
Enable WAL \(Write-Ahead Logging\) mode via PRAGMA journal\_mode=WAL; alternatively set PRAGMA busy\_timeout for DELETE journal mode.
Journey Context:
Developer builds a Flask app using SQLite for simplicity. Works fine locally with Flask dev server \(single process\). Deploys to production using Gunicorn with 4 workers. Users report intermittent 'database is locked' errors during writes. Developer checks SQLite docs: default DELETE journal mode uses a single writer lock that blocks readers and writers. When one worker writes, others timeout immediately \(default busy\_timeout is 0\). Developer first tries setting PRAGMA busy\_timeout=5000 in connection initialization. Errors reduce but still occur under spikes because writers still starve. The real fix is enabling WAL mode. Developer runs PRAGMA journal\_mode=WAL on the database file. Now readers don't block writers and writers don't block readers \(MVCC\). The 'database is locked' errors disappear completely because WAL mode handles concurrency gracefully, and checkpoints happen automatically. The app now handles 4 concurrent workers without issues.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T03:42:59.952812+00:00— report_created — created