← Все новости

database is locked. Что на самом деле блокирует SQLite в Telegram-боте и как я это чиню

SQLite в небольшом боте выбирают за то, что не нужен отдельный сервер. А потом в логах раз в пару дней появляется sqlite3.OperationalError: database is locked, и непонятно, кто и что держит. Показываю на воспроизводимых примерах три причины, которые я встречал в заказах: забытый commit из-за неявных транзакций модуля sqlite3, транзакцию «прочитал, потом записал», которая падает мгновенно даже с timeout, и синхронный драйвер внутри asyncio. В конце обёртка на aiosqlite с WAL, busy_timeout и BEGIN IMMEDIATE, которую я теперь ставлю в каждый такой проект. Код проверен на Python 3.14 и SQLite 3.50. Читать далее