OperationalError: база данных заблокирована

Я сделал несколько повторяющихся операций в своем приложении (тестирование), и вдруг я получаю странную ошибку:

OperationalError: database is locked

я перезапустил сервер, но ошибка сохраняется. Что все это значит?

5 ответов


из django doc:

SQLite предназначен для легкого база данных, и таким образом не может поддерживать a высокий уровень параллелизма. OperationalError: база данных заблокирована ошибки указывают на то, что ваше приложение испытывает больше параллелизма, чем sqlite может обрабатывать по умолчанию конфигурация. Эта ошибка означает, что один поток или процесс имеет исключительный заблокировать соединение с базой данных и еще один поток тайм-аут ожидания замок будет выпущенный.

оболочка SQLite Python имеет значение по умолчанию значение времени ожидания, определяющее, как долго второй поток может подождать на замке до того, как истечет время. вызывает OperationalError: база данных заблокирована ошибка.

Если вы получаете эту ошибку, вы можете решите его:

переключение на другой сервер базы данных. В определенный момент SQLite становится слишком "lite" для реальных приложений, и такого рода ошибки параллелизма покажите, что вы достигли этой точки.

переписывание кода для уменьшения параллелизм и обеспечение базы данных сделки недолговечны.

увеличить значение тайм-аута по умолчанию параметра базы данных тайм-аут optionoption

http://docs.djangoproject.com/en/dev/ref/databases/#database-is-locked-errorsoption


практическая причина этого часто заключается в том, что оболочки python или django открыли запрос к БД, и он не был закрыт должным образом; убийство доступа к терминалу часто освобождает его. У меня была эта ошибка при запуске тестов командной строки Сегодня.

Edit: я получаю периодические upvotes на этом. Если вы хотите убить доступ без перезагрузки терминала, то из командной строки вы можете сделать:

from django import db
db.connections.close_all()

в моем случае это было потому, что я открываю базу данных из браузера SQLite. Когда я закрываю его из браузера, проблема исчезает.


в моем случае я не сохранил операцию базы данных, которую я выполнил в браузере SQLite. Сохранение его решило проблему.


попробуйте эту команду:

sudo fuser -k 8000/tcp