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