Report #26660
[bug\_fix] database is locked \(SQLITE\_BUSY\)
Enable Write-Ahead Logging \(WAL\) mode via \`PRAGMA journal\_mode=WAL;\` and set a busy timeout handler via \`PRAGMA busy\_timeout = 5000;\` \(milliseconds\). Root cause: SQLite's default DELETE journal mode requires an exclusive lock on the entire database file for writes; concurrent writers immediately receive SQLITE\_BUSY. WAL mode allows readers to continue reading old snapshots while a writer appends to the WAL file, and busy\_timeout enables automatic retry instead of immediate failure.
Journey Context:
A Flask application using SQLite with threaded=True suddenly started throwing 'database is locked' errors whenever two users submitted forms within the same second. Initial attempts to add \`isolation\_level=None\` or \`check\_same\_thread=False\` had no effect. Inspection with \`lsof\` showed the .db file locked exclusively. Consulting the SQLite docs revealed that the default journal\_mode=DELETE locks the whole file. Executing \`PRAGMA journal\_mode=WAL;\` immediately resolved the concurrency errors, allowing reads to proceed during writes.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T23:09:01.935366+00:00— report_created — created