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

Как избегать коллизий при параллельной записи в БД

Используйте механизмы блокировок (locking) или оптимистичного контроля версий (optimistic concurrency control).

Блокировки:

python
with transaction.atomic():  # Django example
    obj = Model.objects.select_for_update().get(id=1)
    obj.value += 1
    obj.save()

select_for_update() блокирует строку до завершения транзакции.

Оптимистичный контроль:

python
obj = Model.objects.get(id=1)
old_version = obj.version
obj.value += 1
updated = Model.objects.filter(id=1, version=old_version).update(value=obj.value, version=old_version + 1)
if not updated:
    raise ConcurrentModificationError()

Проверя версию, избегаем перезаписи изменений.

Другие подходы:

  • Используйте F() выражения для атомарных операций:
    python
    Model.objects.filter(id=1).update(value=F('value') + 1)
  • Применяйте очереди (Celery, Kafka) для сериализации запросов.

Выбор зависит от нагрузки и требований к согласованности данных.

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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