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

Загрузка коллекций может быть сделана

  1. путем активного извлечения @OneToMany (fetch = FetchType.EAGER). Если атрибут извлечения не указан, тип извлечения по умолчанию - LAZY. В вашем случае тип fetch не является причиной этого.
  2. , получив доступ к коллекции ингредиентов внутри сессии, hibernate инициализирует / загружает ее, используя select from DB. Это может произойти при выполнении итерации коллекции или при вызове food.getIngredients().size(), food.getIngredients().isEmpty() или других методов.

Я предполагаю, что некоторый код обращается к коллекции, и это вызывает ее.

45
задан Pokechu22 24 October 2014 в 14:26
поделиться

3 ответа

Из django doc:

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

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

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

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

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

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

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

64
ответ дан 7 November 2019 в 14:47
поделиться

У меня есть та же ошибка! Одной из причин было соединение с БД, не был закрыт. Поэтому проверьте на открытые соединения с БД . Кроме того, проверьте, имеете ли Вы , фиксировал DB прежде, чем закрыть соединение.

2
ответ дан 7 November 2019 в 14:47
поделиться

Я встретился с этим сообщением об ошибке в ситуации, которая (ясно) не обращена информацией о справке, связанной в ответе patrick.

, Когда я использовал transaction.atomic() для обертывания вызова к FooModel.objects.get_or_create() и назвал тот код одновременно от двух различных потоков, только один поток успешно выполнится, в то время как другой добрался бы, "база данных заблокирована" ошибка. Изменение параметра базы данных тайм-аута не имело никакого эффекта на поведение.

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

я решил проблему при помощи threading.RLock объект вместо transaction.atomic(), когда мое приложение Django работает с sqlite бэкендом. Это не совсем эквивалентно, таким образом, Вы, возможно, должны сделать что-то еще в своем приложении.

Вот мой код, который работает FooModel.objects.get_or_create одновременно от двух различных потоков, в случае, если это полезно:

from concurrent.futures import ThreadPoolExecutor

import configurations
configurations.setup()

from django.db import transaction
from submissions.models import ExerciseCollectionSubmission

def makeSubmission(user_id):
    try:
        with transaction.atomic():
            e, _ = ExerciseCollectionSubmission.objects.get_or_create(
                student_id=user_id, exercise_collection_id=172)
    except Exception as e:
        return f'failed: {e}'

    e.delete()

    return 'success'


futures = []

with ThreadPoolExecutor(max_workers=2) as executor:
    futures.append(executor.submit(makeSubmission, 296))
    futures.append(executor.submit(makeSubmission, 297))

for future in futures:
    print(future.result())
2
ответ дан 7 November 2019 в 14:47
поделиться
Другие вопросы по тегам:

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