What to do about SQLITE_BUSY errors despite setting a timeout - Bert Hubert's writings
a day ago
- SQLite's WAL mode allows concurrent reads and writes, but transactions that upgrade from read-only to read-write can cause immediate SQLITE_BUSY errors regardless of timeout settings.
- To avoid SQLITE_BUSY errors, use 'BEGIN IMMEDIATE' or start transactions with a write statement to prevent upgrades, as upgrades fail immediately when another write transaction is active.
- SQLITE_BUSY errors from transaction upgrades are a fundamental issue with serializable isolation, also present in PostgreSQL and other databases, requiring careful transaction management.
- Strategies to mitigate serialization failures include declaring transactions as READ ONLY, controlling active connections via pooling, minimizing transaction scope, and avoiding idle transactions.
- Alternative approaches to prevent SQLITE_BUSY errors are starting writes immediately, using 'BEGIN IMMEDIATE', avoiding multi-statement transactions, or sequentially opening connections to avoid SQLITE_BUSY_RECOVERY