@FCKJesus

Как избежать ошибки database is locked?

Есть тг бот на aiogram в связке aiosqlite и selenium, столкнулся с проблемой при масштабировании
При работе более 20 браузеров, начинает спамить эксепшен database is locked
Что наглухо кладет самого бота, и начинается пропуск заданий.
Локализировал проблему, но не могу понять как решить, в сухом остатке есть около 20 потоков которые обращаются к бд около 2х -3х раз в секунду.
Вот сам код апдейта:
async def update_balance.(rate: float, account_id: int):
    try:
        db = await aiosqlite.connect('ozon.db')
        await db.execute('''
                UPDATE balance, accounts
                SET balance.user_balance - {0}, accounts.cards + 1
                WHERE accounts.account_id = {1}
                AND balance.user_id = accoounts.user_id'''.format(2*rate, account_id)
            )
    except aiosqlite.DatabaseError as e:
        logging.error('Ошибка при записи баланса', e)
        await db.rollback()
    finally:
        await db.close()
  • Вопрос задан
  • 2175 просмотров
Решения вопроса 1
@galaxy
Sqlite так устроена - читающих соединений может быть много, но пишущее - только одно в каждый момент времени. Причем по умолчанию пишущее соединение заблокирует и всех читателей.
Чтобы читатели не блокировались, нужно включить WAL
db.execute("PRAGMA journal_mode=WAL")

При этом пишущее соединение по-прежнему будет в каждый момент одно. Если это вас не устраивает, вы выбрали неправильный инструмент, и надо смотреть в сторону нормальных серверных СУБД (mysql, postgresql).
Теоретически могло бы помочь выставление большего таймаута (но я не вижу, как его вообще менять в aiosqlite) или отлов ошибки "database is locked" и повторные попытки.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Как избежать ошибки database is locked?

Избавиться от SQLite
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы