Представим ситуацию. Есть система в ней есть пользователи-админы, допустим их сейчас 2.
Каждый админ может удалять других админов.
Но нужно сделать так что в системе остался по крайней мере один админ.
Первое что приходит в голову такая логика.
function deleteUser(int userId) {
if (getAdminsCount() == 1) {
abort();
}
makeSqlQueryToDeleteUser(userId); // прежде чем запрос зайдет в базу и она удалит запись, может пройти например 1 миллисекунда
}
Но если Админ А инициирует удаление, и при этом Админ Б тоже инициирует удаление перед самой операцией удаления от первого админа, то он пройдет проверку на последнего пользователя (т.к. сама операция удаления еще не запустилась).
И получается что оба пользователя удалят друг друга и в системе не останется не одного админа. (да шанс не большой, но все же)
Как бы вы решили данную проблему?
Рассматривал помещение этой операции в очередь (queue), но размышляю есть ли другие способы.