Если у нас осталось два гнома и два пользователя одновременно удаляют по одному — как не допустить удаления всех гномов?

Проверка количества и удаление должны быть частью общей конкурентно защищённой операции. Иначе два запроса увидят count = 2 и каждый удалит своего гнома, нарушив правило.

Короткий ответ

Что ответить на собеседовании

Проверка количества и удаление должны быть частью общей конкурентно защищённой операции. Иначе два запроса увидят count = 2 и каждый удалит своего гнома, нарушив правило.

Подробный разбор

Ответ с пояснениями

Проверка количества и удаление должны быть частью общей конкурентно защищённой операции. Иначе два запроса увидят count = 2 и каждый удалит своего гнома, нарушив правило.

Один вариант — блокировать строку родительской коллекции в транзакции, затем проверять количество и удалять. Все операции, влияющие на инвариант, должны использовать ту же блокировку. Другой вариант — SERIALIZABLE с корректным повтором конфликтующих транзакций, если подходит СУБД. Блокировка только удаляемой строки недостаточна: запросы удаляют разные строки. При последнем объекте возвращают согласованный бизнес-конфликт.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее