Почему база данных ломается?

Сделал игрового бота для Вконтакте. В течении первого времени все работает как нужно. После минут 20 выходит ошибка, данные в таблицах смешиваются друг с другом или данные в ячейках просто стираются, из-за чего приходится их чистить.

Сначала выключить синхронизацию и запись в журнал, после поставил синхронизацию в NORMAL и FULL режим, ничего не изменилось.

Почему база данных ломается? И почему не сразу а после длительного времени? Может быть это из-за нагрузки?

попробую включить так же запись в журнал, но не думаю что это поможет...


Ответы (1 шт):

Автор решения: Сабир Исламов

Сделай в своем годе две вещи:

  1. Во первых при начале внесения изменений открывай новую транзакцию, а во вторых в конце изменений закрывай её;
  2. Переведи всю базу из NORMAL в WAL вот так:
PRAGMA journal_mode=WAL;

И уже после этих изменений проверь работу, и если не поможет, то добавь в свой вопрос хоть какой-то код и журналы/коды ошибок и так далее.

P.S.: SQLite дает возможность работать с базой данных из нескольких потоков/процессов, но необходимо следить за блокировками, то есть если ты делаешь попытку записи, то следи за кодами возврата из функции: запись может пройти безрезультатно, но сама СУБД тебя об этом уведомит кодом ответа, тогда твой процесс должен взять паузу, и попробовать повторить запись позже. SQLite в отличии от Oracle или PostgreSQL не поддерживает версионирование данных, по этому данные всегда хранятся одной версии, и доступ к ним осуществляется поочерёдно и пока кто-то работает с таблицей - она заблокирована. Эта СУБД для небольших систем, а не для промышленных, но для бота она более чем подходит

→ Ссылка