Выбор ответа Middle Проектирование и нормализация спрашивают часто обновлено
Уникальность только в коде
Вопрос
Регистрация проверяет в коде «есть ли пользователь с таким email», и если нет, делает INSERT. Уникального ограничения в базе нет. Что пойдёт не так?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Два параллельных запроса увидят свободный email и оба вставят. Это гонка check-then-act: между SELECT и INSERT другая транзакция успевает вставить то же значение.
Варианты ответа
- Ничего, если проверка и вставка в одной транзакции Read Committed
- Два параллельных запроса увидят свободный email и оба вставятправильный ответ
- Проверка будет медленной на больших таблицах, но дублей не будет
- ORM сама добавит уникальный индекс по проверяемому полю
Разбор
Это гонка check-then-act: между SELECT и INSERT другая транзакция успевает вставить то же значение. Транзакция Read Committed этого не предотвращает: вставка, которой ещё нет в снимке, не видна и ничего не блокирует. Надёжно только ограничение в базе: UNIQUE (или уникальный индекс), а приложение обрабатывает ошибку нарушения уникальности. ORM сама ограничения в существующую схему не добавляет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Проектирование и нормализация»
- Нарушение второй нормальной формы
- Транзитивная зависимость
- Денормализация
- Нормализация
- Суррогатный ключ
- Связь многие ко многим
- Тип для денег
- ON DELETE CASCADE