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

Что произойдет, если две транзакции пытаются изменить одну запись в БД

При одновременном изменении одной записи двумя транзакциями поведение зависит от уровня изоляции БД:

  1. READ COMMITTED (по умолчанию в PostgreSQL): Вторая транзакция будет ждать, пока первая завершится (commit/rollback). Если первая делает commit, вторая увидит изменения и будет работать с обновленными данными. Если rollback - вторая продолжит с исходными данными.
  1. SERIALIZABLE: Одна из транзакций получит ошибку сериализации (например, SerializationError в PostgreSQL), и её нужно будет перезапустить.

Пример конфликта в Django:

python
# Транзакция 1
with transaction.atomic():
    obj = MyModel.objects.select_for_update().get(pk=1)
    obj.counter += 1
    obj.save()
    # Транзакция 2 заблокируется здесь до завершения этой

# Транзакция 2 (параллельно)
with transaction.atomic():
    obj = MyModel.objects.select_for_update().get(pk=1)  # Блокировка
    obj.counter += 10
    obj.save()

Для обработки конфликтов часто используют:

  • Оптимистичные блокировки (версионирование)
  • Повторные попытки (retry)
  • Явные блокировки (SELECT FOR UPDATE)
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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