Выбор ответа Middle Проектирование и нормализация спрашивают часто обновлено

Уникальность только в коде

Вопрос

Регистрация проверяет в коде «есть ли пользователь с таким email», и если нет, делает INSERT. Уникального ограничения в базе нет. Что пойдёт не так?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Два параллельных запроса увидят свободный email и оба вставят. Это гонка check-then-act: между SELECT и INSERT другая транзакция успевает вставить то же значение.

Варианты ответа

  1. Ничего, если проверка и вставка в одной транзакции Read Committed
  2. Два параллельных запроса увидят свободный email и оба вставятправильный ответ
  3. Проверка будет медленной на больших таблицах, но дублей не будет
  4. ORM сама добавит уникальный индекс по проверяемому полю

Разбор

Это гонка check-then-act: между SELECT и INSERT другая транзакция успевает вставить то же значение. Транзакция Read Committed этого не предотвращает: вставка, которой ещё нет в снимке, не видна и ничего не блокирует. Надёжно только ограничение в базе: UNIQUE (или уникальный индекс), а приложение обрабатывает ошибку нарушения уникальности. ORM сама ограничения в существующую схему не добавляет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.