Встречается на собеседованиях • сегодня

Как избежать гонки значений в БД

Для предотвращения гонки значений в БД используйте механизмы блокировок или оптимистичного контроля версий:

  1. Блокировки (Pessimistic locking)
    Блокируйте запись на время транзакции:
    python
    with transaction.atomic():
        obj = MyModel.objects.select_for_update().get(pk=1)
        obj.value += 1
        obj.save()
    Примечание: select_for_update() блокирует строку до конца транзакции.
  1. Оптимистичная блокировка (Optimistic locking)
    Добавьте поле версии и проверяйте его при обновлении:

    python
    obj = MyModel.objects.get(pk=1)
    old_version = obj.version
    obj.value += 1
    updated = MyModel.objects.filter(pk=1, version=old_version).update(
        value=obj.value,
        version=old_version + 1
    )
    if not updated:
        raise ConcurrentModificationError()
  2. Используйте атомарные операции

    python
    MyModel.objects.filter(pk=1).update(value=F('value') + 1)
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы