На Хабре вышел материал с характерным заголовком: «database is locked. Что на самом деле блокирует SQLite в Telegram-боте и как я это чиню». Сразу оговоримся: у нас есть только заголовок и описание этой публикации, полного текста мы не видели, поэтому пересказываем именно то, что заявлено автором, без домыслов о коде и выводах, которых нет в описании.
Автор пишет, что SQLite в небольших ботах выбирают потому, что не нужен отдельный сервер базы данных — это действительно обычная практика для компактных проектов. Но спустя какое-то время в логах начинает появляться ошибка sqlite3.OperationalError: database is locked, и разобраться, кто именно держит блокировку, не так просто. По описанию, автор разбирает три типичные причины такой ошибки: забытый commit из-за неявных транзакций модуля sqlite3, транзакцию «прочитал, потом записал», которая падает мгновенно даже при выставленном timeout, и использование синхронного драйвера внутри asyncio-кода. В качестве решения предлагается обёртка на aiosqlite с режимом WAL, busy_timeout и явным BEGIN.
Почему это не просто баг одного бота
На первый взгляд тема узкоспециальная — интересна разработчикам, которые пишут Telegram-ботов на Python. Но если присмотреться, за ней стоит более общий класс сервисов: любой бот, который принимает сообщения из одного источника и должен надёжно сохранить или переслать их дальше, рискует столкнуться именно с такими блокировками базы. Чем выше нагрузка и чем чаще происходят одновременные чтение и запись, тем вероятнее, что «игрушечная» SQLite начнёт заикаться.
Отдельный момент из описания — синхронный драйвер внутри asyncio. Это распространённая ошибка: асинхронный код создаёт иллюзию параллельности, но если под капотом операции с базой выполняются синхронно и блокируют event loop, проблема только маскируется, а не решается. Это важное технически замечание, и оно справедливо для любого бота на Python, который работает с заметным потоком сообщений.
Что это значит для пользователя мессенджеров
Для обычного человека, который просто переписывается в MAX или Telegram, слова «SQLite», «WAL» и «busy_timeout» звучат абстрактно. Но следствия таких багов вполне конкретны: сообщение может прийти с задержкой, не прийти вовсе, продублироваться или «потеряться» между двумя системами. Для ботов, которые просто отвечают на команды, это неприятно, но не критично. А вот для сервисов, которые выступают связующим звеном между двумя мессенджерами и должны гарантированно доставить каждое сообщение в обе стороны, надёжность хранения данных — это вопрос доверия, а не только технической гигиены.
Контекст MAX и Telegram в России
Сейчас многим пользователям в России приходится держать на телефоне сразу два мессенджера: MAX — потому что это нужно или требуется, и Telegram — потому что там привычный интерфейс, контакты и каналы. В такой ситуации востребованы сервисы-мосты, которые пересылают сообщения из MAX в Telegram и обратно, чтобы не держать оба приложения постоянно открытыми. И именно для таких сервисов проблема «database is locked» — это не гипотетический сценарий из статьи на Хабре, а ровно та зона риска, в которой нужно быть особенно аккуратным: любая потерянная транзакция — это реальное пропущенное или задержанное сообщение собеседника.
При чём здесь Максограм
Максограм устроен именно по этой схеме: вы ставите MAX на отдельный телефон, сканируете QR-код в боте @maxogrambot — и дальше входящие сообщения из MAX приходят к вам в Telegram, а ответы оттуда же уходят обратно в MAX. После этого сам MAX на основном телефоне можно не держать. Мы не раскрываем детали внутренней реализации сервиса и не будем делать вид, что знаем, как именно автор статьи с Хабра чинил свой конкретный бот — но сам класс проблем, который он описывает, прямо указывает на то, почему для сервиса-моста важна предсказуемая, не теряющая сообщения архитектура хранения данных, а не просто «работает на тесте».
Что в итоге важно запомнить
- SQLite удобна для маленьких ботов, но при росте нагрузки требует аккуратной работы с транзакциями — это техническая деталь, но она напрямую влияет на доставку сообщений.
- Для ботов, которые просто отвечают пользователю, редкая блокировка базы — мелкая неприятность.
- Для сервисов-мостов между мессенджерами та же проблема означает риск потери или задержки переписки, а значит это вопрос надёжности и приватности переписки пользователя.
Если вам важно получать сообщения из MAX в привычном интерфейсе Telegram без риска что-то пропустить и без необходимости держать MAX на основном телефоне — попробуйте Максограм: установка через QR-код в @maxogrambot занимает пару минут.